[英]When is it appropriate to use a setTimeout vs a Cron?
我正在构建一个使用 mongo 数据库的 Meteor 应用程序。
我有一个可能有 1000 个需要在不同时间更新的文档的集合。
我是在创建时运行 setTimeouts 还是每秒运行一次并循环遍历每个文档的 cron 作业?
每种做法的优缺点是什么?
把它放在上下文中:
我正在构建一个在线锦标赛系统。 我可以进行 100 场比赛,这意味着我可以进行 1000 场比赛。
每场比赛都需要在特定时间绝对结束,并且可以在某个条件下提前结束。
使用操作系统级别的 cron 作业将不起作用,因为您只能使用 60 秒的分辨率进行检查。 因此,通过“cron job”,我认为您的意思是单个setTimeout
(或synced-cron )。 以下是一些想法:
策略:每秒唤醒并检查大量匹配项,更新那些已完成的匹配项。 如果您有多个服务器,则可以通过 synced-cron 阻止除其中之一之外的所有服务器进行检查。
这种策略的优点是实施起来很简单。 缺点是:
如果您确信可以控制运行时,我会推荐此策略。 例如,如果您可以在endTime
索引您的匹配项,那么在每个周期中只需要检查几个匹配项。
策略:在创建时或服务器启动时为每个匹配添加一个setTimeout
。 当每个超时到期时,更新相应的匹配项。
这种策略的优点是它可能会删除大量不必要的数据库流量。 缺点是:
如果您认为在可预见的未来将使用单个服务器,我会推荐此策略。
鉴于您提出的选择,这些是我想到的权衡。 更强大的解决方案可能会涉及到流星/mongo 堆栈之外的技术。 例如,将匹配时间存储在 redis 中,然后侦听keyspace 通知。
老实说,这完全是个人喜好问题。
我非常喜欢编写小的、独立的程序,每个程序都做一件事,而且做得很好。 如果您也是这样,最好编写单独的程序以通过 cron 定期运行。
通过这种方式,您可以保证操作系统控制的时间精度,以及易于在 web 应用程序上下文之外调试的小而简单的程序。
不过,这只是一种偏好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.