如何大规模地为所有用户周期性地处理一个逻辑或作业?
How to process a logic or job periodically for all users in a large scale?
我的项目中有大量用户,大约 50m。
我应该每天为每个用户创建一个播放列表,为此,我目前正在使用这种方法:
我在我的用户 table 中有一列,其中包含为该用户创建播放列表的最新时间,我将其命名为 last_playlist_created_at
。
我 运行 对用户 table 的查询并获得前 1000 个,即选择他们的 last_playlist_created_at
过去一天的用户列表并将结果排序按 last_playlist_created_at
升序排列
之后,我 运行 对结果进行 foreach
并在我的消息代理中为每个人发布一条消息。
在消息代理后面,我启动了大约 64 个工作人员来处理消息(为用户创建播放列表)并在用户的 table.
中更新 last_playlist_created_at
如果我的消息代理消息列表为空,我将重复这些步骤(While - Do-While)
我觉得这个处理方式还不错,还可以扩展,
但是我们用来为每个用户创建消息的方法是不可扩展的!
我应该如何为每个用户发送大量消息?
好的,所以我的回答完全基于您提到您使用 while(true)
检查播放列表是否需要更新的评论,这看起来并不那么微不足道。
虽然这是一个设计问题,并且有多种解决方案,但这里是我的解决方案。
首先,将为用户更新播放列表视为一项工作。
现在,在您的情况下,这是一个预定的作业。 IE。每天一次。
- 所以,使用调度程序来安排下一个作业时间。
- 编写计划作业处理程序以将其推送到消息队列。这部分只是为了同时处理多个作业,您可以控制流程。
- 根据工作为用户生成播放列表。为第二天创建计划事件。
- 您可以保留计划作业数据以避免竞争条件。
我的项目中有大量用户,大约 50m。
我应该每天为每个用户创建一个播放列表,为此,我目前正在使用这种方法:
我在我的用户 table 中有一列,其中包含为该用户创建播放列表的最新时间,我将其命名为 last_playlist_created_at
。
我 运行 对用户 table 的查询并获得前 1000 个,即选择他们的 last_playlist_created_at
过去一天的用户列表并将结果排序按 last_playlist_created_at
之后,我 运行 对结果进行 foreach
并在我的消息代理中为每个人发布一条消息。
在消息代理后面,我启动了大约 64 个工作人员来处理消息(为用户创建播放列表)并在用户的 table.
中更新last_playlist_created_at
如果我的消息代理消息列表为空,我将重复这些步骤(While - Do-While)
我觉得这个处理方式还不错,还可以扩展, 但是我们用来为每个用户创建消息的方法是不可扩展的!
我应该如何为每个用户发送大量消息?
好的,所以我的回答完全基于您提到您使用 while(true)
检查播放列表是否需要更新的评论,这看起来并不那么微不足道。
虽然这是一个设计问题,并且有多种解决方案,但这里是我的解决方案。
首先,将为用户更新播放列表视为一项工作。
现在,在您的情况下,这是一个预定的作业。 IE。每天一次。
- 所以,使用调度程序来安排下一个作业时间。
- 编写计划作业处理程序以将其推送到消息队列。这部分只是为了同时处理多个作业,您可以控制流程。
- 根据工作为用户生成播放列表。为第二天创建计划事件。
- 您可以保留计划作业数据以避免竞争条件。