【发布时间】:2020-12-25 01:22:34
【问题描述】:
我们有什么?
在 Node.js 中构建的 API(使用 Moleculer.js 进行微服务,使用 PostgreSQL 存储数据)具有跟踪用户和用户组的功能。我们每个组平均有 3000 个用户,并且一个用户可以是多个组的一部分。
我们想要实现什么?
我们想创建一个发送短信的特殊服务。管理员将选择多个组,代码将删除重复的用户并向他们发送短信。
经过选择,我们可以拥有大约 100 万用户。我们如何才能有效地向他们发送短信?
我们尝试了什么?
-
对用户进行分页,并为每个页面向 SMS 服务发送请求。
const users = db.getPage(1); // [{ id: 1, phone: '+123456789' }, ...] smsClient.sendBulk(users);问题:数据库中的用户列表可能会在处理过程中发生变化,并可能通过给我们重复或跳过一些用户来影响分页。
-
将所有结果加载到内存中,并将所有用户发送到短信服务。
const users = db.getAll(); // [..., { id: 988123, phone: '+987654321' }] smsClient.sendBulk(users);问题:我们认为,对数据库进行这种查询并将它们保存在内存中是一个坏主意,从资源角度考虑。同时,我们不想通过 HTTP 请求向 SMS 服务发送 100 万个实体。
我们如何选择 100 万用户并向他们发送 SMS 消息,而不用担心重复、跳过数据或对管理员的选择进行任何其他更改?我们曾考虑将排队作为必要的步骤,但在我们为上述案例找到解决方案之后。或者,队列是解决方案的一部分吗?
【问题讨论】:
标签: javascript node.js queue sms microservices