Javascript 如何通过编程方式使用队列向100万用户发送短信通知?

Javascript 如何通过编程方式使用队列向100万用户发送短信通知?,javascript,node.js,queue,sms,microservices,Javascript,Node.js,Queue,Sms,Microservices,我们有什么? Node.js中的API内置(使用Moleculer.js提供微服务,使用PostgreSQL存储数据),具有跟踪用户和用户组的功能。我们平均每个组有3k用户,一个用户可以是多个组的一部分 我们想要实现什么? 我们想创建一个特殊的服务,将发送短信。管理员将选择多个组,代码将删除重复的用户并向他们发送短信 经过选择后,我们可以拥有约100万用户。我们怎样才能有效地向他们发送短信 我们尝试了什么? 对用户进行分页,并为每个页面向SMS服务发送请求 const users=db.getP

我们有什么?

Node.js中的API内置(使用Moleculer.js提供微服务,使用PostgreSQL存储数据),具有跟踪用户和用户组的功能。我们平均每个组有3k用户,一个用户可以是多个组的一部分

我们想要实现什么?

我们想创建一个特殊的服务,将发送短信。管理员将选择多个组,代码将删除重复的用户并向他们发送短信

经过选择后,我们可以拥有约100万用户。我们怎样才能有效地向他们发送短信

我们尝试了什么?

  • 对用户进行分页,并为每个页面向SMS服务发送请求

    const users=db.getPage(1);//[{id:1,电话:'+123456789'},…]
    smsClient.sendBulk(用户);
    
    问题:数据库中的用户列表可能会在过程中发生更改,并会通过给我们提供重复项或跳过某些用户而影响分页

  • 将所有结果加载到内存中,并将所有用户发送到SMS服务

    const users=db.getAll();//[…,{id:988123,电话:'+987654321'}]
    smsClient.sendBulk(用户);
    
    问题:我们认为,在资源方面,对数据库进行此类查询并将其保存在内存中是个坏主意。同时,我们不希望通过HTTP请求向SMS服务发送100万个实体

  • 我们如何才能选择100万用户并向他们发送短信,而不必担心重复、跳过数据或管理员选择的任何其他更改?我们认为排队是一个必要的步骤,但在我们找到上述案例的解决方案之后。或者,队列是解决方案的一部分吗

    我们如何选择100万用户并向他们发送短信,而不必担心重复、跳过数据或管理员选择的任何其他更改

    要管理重复项,可以使用额外的数据库为已处理的用户保存哈希表。这是有点贵,因为你需要检查用户之前,每次短信发送

    管理不跳过有点棘手,因为您需要向正在进行的SMS事务添加更多收件人。您需要能够在用户被添加到组时检测(钩住),并将其作为收件人添加到正在进行的事务中。 您需要找到一个fast DB,并将该用户保存在fast
    集合和
    get
    HashSet
    中(
    O(1)

    我们认为排队是一个必要的步骤,但在我们找到上述案例的解决方案之后。或者,队列是解决方案的一部分吗

    辩护地。在这种情况下,排队是正确的方法(将许多小任务排队)。有些队列带有
    re queue
    功能,可以对未得到确认的任何任务重新排队

    我们如何选择100万用户并向他们发送短信,而不必担心重复、跳过数据或管理员选择的任何其他更改

    要管理重复项,可以使用额外的数据库为已处理的用户保存哈希表。这是有点贵,因为你需要检查用户之前,每次短信发送

    管理不跳过有点棘手,因为您需要向正在进行的SMS事务添加更多收件人。您需要能够在用户被添加到组时检测(钩住),并将其作为收件人添加到正在进行的事务中。 您需要找到一个fast DB,并将该用户保存在fast
    集合和
    get
    HashSet
    中(
    O(1)

    我们认为排队是一个必要的步骤,但在我们找到上述案例的解决方案之后。或者,队列是解决方案的一部分吗


    辩护地。在这种情况下,排队是正确的方法(将许多小任务排队)。一些队列带有重新排队功能,可以对未得到确认的任何任务重新排队。

    您需要签出RabbitMQ.message-driven microservices

    您需要签出RabbitMQ.message-driven microservices

    您是否考虑过在用户和发送的SMS之间创建一个间接状态?类似于SmsRequest/SmsTask/不管你怎么称呼它

    它包括必要的用户数据、消息内容、请求状态(发送发送发送失败、…)以及一些附加元数据,具体取决于您的需要

    然后,您要做的第一步是准备这些请求并将它们存储在数据库中,从而有效地从表中生成队列。您可以在用户和消息类型上添加一些限制,以防止任何重复,然后启动第二个异步进程,该进程只需在状态下获取请求以发送,将状态设置为发送,然后保存结果

    这也为您带来了audit+的好处,您可以批处理传出的消息和消息


    当然,它会显著增加您的数据量,但我想现在它很便宜。

    您是否考虑过在用户和发送的SMS之间创建一个间接状态?类似于SmsRequest/SmsTask/不管你怎么称呼它

    它包括必要的用户数据、消息内容、请求状态(发送发送发送失败、…)以及一些附加元数据,具体取决于您的需要

    然后,您要做的第一步是准备这些请求并将它们存储在数据库中,从而有效地从表中生成队列。你可以添加一些解释