Javascript 如何通过编程方式使用队列向100万用户发送短信通知?
我们有什么? Node.js中的API内置(使用Moleculer.js提供微服务,使用PostgreSQL存储数据),具有跟踪用户和用户组的功能。我们平均每个组有3k用户,一个用户可以是多个组的一部分 我们想要实现什么? 我们想创建一个特殊的服务,将发送短信。管理员将选择多个组,代码将删除重复的用户并向他们发送短信 经过选择后,我们可以拥有约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
const users=db.getPage(1);//[{id:1,电话:'+123456789'},…]
smsClient.sendBulk(用户);
问题:数据库中的用户列表可能会在过程中发生更改,并会通过给我们提供重复项或跳过某些用户而影响分页
const users=db.getAll();//[…,{id:988123,电话:'+987654321'}]
smsClient.sendBulk(用户);
问题:我们认为,在资源方面,对数据库进行此类查询并将其保存在内存中是个坏主意。同时,我们不希望通过HTTP请求向SMS服务发送100万个实体
集合和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/不管你怎么称呼它
它包括必要的用户数据、消息内容、请求状态(发送、发送、发送、失败、…)以及一些附加元数据,具体取决于您的需要
然后,您要做的第一步是准备这些请求并将它们存储在数据库中,从而有效地从表中生成队列。你可以添加一些解释