什么时候适合使用 setTimeout 与 Cron
When is it appropriate to use a setTimeout vs a Cron?
我正在构建一个使用mongo数据库的Meteor应用程序。
我有一个集合,可能有 1000 个文档需要在不同时间更新。
我是在创建时运行 setTimeouts 还是每秒运行一次并遍历每个文档的 cron 作业?
做每个都有利弊?
将其置于上下文中:
我正在建立一个在线锦标赛系统。我可以举办 100 场锦标赛,这意味着我可以举办 1000 场比赛。
每场比赛都需要在特定时间绝对结束,并且在一定条件下可以提前结束。
使用操作系统级别的 cron 作业不起作用,因为您只能使用 60 秒的分辨率进行检查。所以"cron job",我认为你的意思是单个setTimeout
(或同步 cron(。以下是一些想法:
单集超时
策略:每秒醒来并检查大量匹配项,更新已完成的匹配项。如果您有多台服务器,则可以阻止除其中一台之外的所有服务器通过 synced-cron 进行检查。
此策略的优点是易于实施。缺点是:
- 您最终可能会执行大量不必要的数据库读取。
- 您必须非常小心,确保您的处理时间不超过检查之间的时间长度(一秒(。
如果您确信可以控制运行时,我建议您使用此策略。例如,如果可以在endTime
上为匹配项编制索引,则每个周期中只需检查几个匹配项。
多次设置超时
策略:在创建时或服务器开始时为每个匹配项添加一个setTimeout
。每次超时到期时,请更新相应的匹配项。
此策略的优点是,它可能会删除大量不必要的数据库流量。缺点是:
- 实现起来可能有点棘手。 例如,您必须考虑服务器重新启动时会发生什么。
- 朴素的实现无法扩展到单个服务器之外(请参阅 1(。
如果您认为在可预见的未来将使用单个服务器,我建议您使用此策略。
<小时 />这些是鉴于您提出的选择而发生在我身上的权衡。更强大的解决方案可能涉及流星/mongo堆栈之外的技术。例如,以 redis 格式存储匹配时间,然后侦听密钥空间通知。
老实说,这都是偏好问题。
我非常喜欢编写小型的独立程序,每个人都做一件事,并且做得很好。如果你也是这样,最好编写单独的程序通过 cron 定期运行。
通过这种方式,您可以保证操作系统控制的时间精度,以及易于在 Web 应用程序上下文之外调试的小型简单程序。
不过,这只是一种偏好。
- setInteval vs setTimeout
- cron作业与Javascript计时事件
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- setTimeout可以与闭包内的函数一起使用吗
- Javascript setTimeout for an array
- 刷新后,setTimeout将工作或不工作
- 继续使用javascript中的setTimeout
- setTimeout函数能否在其前面的代码执行之前激发
- jQuery setTimeOut: in for-loop
- SetTimeout and clearTimeout in Javascript
- 在setTimeout中调用相同的函数
- setTimeout不能太长
- Javascript-SetTimeout导致浏览器冻结
- setTimeout and V8
- 将jQuery对象传递到setTimeout递归函数中
- 是定义的操作系统睡眠/挂起期间setTimeout的行为
- 添加一个setTimeout方法会使jQuery悬停方法忽略setTimeout方法中的函数
- JS:setTimeout函数的UI计数
- 什么时候适合使用 setTimeout 与 Cron
- 流星邮件-同步Cron - setTimeout回调异常:TypeError:不能调用方法'getTime