什么时候适合使用 setTimeout 和 Cron?

gba*_*hik 5 javascript cron settimeout node.js meteor

我正在构建一个使用 mongo 数据库的 Meteor 应用程序。

我有一个集合,可能有数千个文档需要在不同时间更新。

我是在创建时运行 setTimeouts 还是每秒运行一次并循环遍历每个文档的 cron 作业?

每种做法的优点和缺点是什么?

将此放在上下文中:

我正在构建一个在线锦标赛系统。我可以举办 100 场锦标赛,这意味着我可以举办 1000 场比赛。

每场比赛都需要绝对在特定时间结束,并且可以在一定条件下提前结束。

Dav*_*don 4

使用操作系统级别的 cron 作业不起作用,因为您只能以 60 秒的分辨率进行检查。因此,通过“cron job”,我认为你的意思是单个setTimeout(或同步cron)。以下是一些想法:

单次设置超时

战略:每秒醒来并检查大量匹配,更新那些完整的。如果您有多个服务器,您可以阻止除其中一台服务器之外的所有服务器通过synced-cron 进行检查。

该策略的优点是易于实施。缺点是:

  1. 您最终可能会进行大量不必要的数据库读取。
  2. 您必须非常小心,处理时间不要超过两次检查之间的时间长度(一秒)。

如果您确信可以控制运行时间,我会推荐此策略。例如,如果您可以将匹配项索引到endTime,那么每个周期中只需要检查几个匹配项。

多次设置超时

策略:添加一个setTimeout在创建时或服务器启动时为每场比赛添加一个。当每个超时到期时,更新相应的匹配。

此策略的优点是它可能消除大量不必要的数据库流量。缺点是:

  1. 实施起来可能有点棘手。例如,您必须考虑服务器重新启动时会发生什么。
  2. 这种简单的实现无法扩展到单个服务器之外(参见图 1)。

如果您认为在可预见的将来将使用单个服务器,我会推荐此策略。


这些是我在考虑到您提出的选择后所做出的权衡。更强大的解决方案可能会涉及meteor/mongo 堆栈之外的技术。例如,将匹配时间存储在redis中,然后监听keyspace通知