如何大规模地为所有用户周期性地处理一个逻辑或作业?

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。每天一次。

  1. 所以,使用调度程序来安排下一个作业时间。
  2. 编写计划作业处理程序以将其推送到消息队列。这部分只是为了同时处理多个作业,您可以控制流程。
  3. 根据工作为用户生成播放列表。为第二天创建计划事件。
  4. 您可以保留计划作业数据以避免竞争条件。