【问题标题】:How to programatically send SMS notifications to 1 million users using queues?如何使用队列以编程方式向 100 万用户发送 SMS 通知?
【发布时间】:2020-12-25 01:22:34
【问题描述】:

我们有什么?

在 Node.js 中构建的 API(使用 Moleculer.js 进行微服务,使用 PostgreSQL 存储数据)具有跟踪用户和用户组的功能。我们每个组平均有 3000 个用户,并且一个用户可以是多个组的一部分。

我们想要实现什么?

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

经过选择,我们可以拥有大约 100 万用户。我们如何才能有效地向他们发送短信?

我们尝试了什么?

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

    const users = db.getPage(1); // [{ id: 1, phone: '+123456789' }, ...]
    smsClient.sendBulk(users);
    

    问题:数据库中的用户列表可能会在处理过程中发生变化,并可能通过给我们重复或跳过一些用户来影响分页。

  2. 将所有结果加载到内存中,并将所有用户发送到短信服务。

    const users = db.getAll(); // [..., { id: 988123, phone: '+987654321' }]
    smsClient.sendBulk(users);
    

    问题:我们认为,对数据库进行这种查询并将它们保存在内存中是一个坏主意,从资源角度考虑。同时,我们不想通过 HTTP 请求向 SMS 服务发送 100 万个实体。

我们如何选择 100 万用户并向他们发送 SMS 消息,而不用担心重复、跳过数据或对管理员的选择进行任何其他更改?我们曾考虑将排队作为必要的步骤,但在我们为上述案例找到解决方案之后。或者,队列是解决方案的一部分吗?

【问题讨论】:

    标签: javascript node.js queue sms microservices


    【解决方案1】:

    我们如何选择 100 万用户并向他们发送 SMS 消息,而不用担心重复、跳过数据或对管理员的选择进行任何其他更改?

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

    管理不跳过有点棘手,因为您需要将更多收件人添加到正在进行的 SMS 交易中。您将需要能够检测(挂钩)何时将用户添加到组并相应地将其作为收件人添加到正在进行的事务中。 您需要找到一个快速数据库并将该用户保存在 HashSet 中以获得快速 setget (O(1))

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

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

    【讨论】:

      【解决方案2】:

      您需要查看 RabbitMQ.message-driven 微服务

      【讨论】:

        【解决方案3】:

        您是否考虑过在用户和发送的 SMS 之间创建间接状态?像 SmsRequest / SmsTask / 之类的东西,不管你怎么称呼它。

        它包含必要的用户数据、消息内容、请求状态(发送发送发送失败,...)和一些额外的元数据,具体取决于您的需要。

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

        这也为您带来了审计的好处 + 您可以批量发送消息和。

        当然它会显着增加你的数据量,但我想现在它还是很便宜的。

        【讨论】:

          猜你喜欢
          • 2018-10-02
          • 2023-04-10
          • 1970-01-01
          • 2017-01-12
          • 2019-06-20
          • 1970-01-01
          • 2015-02-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多