何时使用setTimeout和Cron是否合适?

时间:2014-12-12 19:41:37

标签: javascript node.js meteor cron settimeout

嘿伙计们,所以我正在构建一个使用mongo数据库的Meteor应用程序。

我有一个可能有1000个文档需要在不同时间更新的集合......

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

每个人的优点和缺点是什么?

将其置于上下文中:

我正在建立一个在线锦标赛系统。我可以参加100场比赛,这意味着我可以有1000场比赛。

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

2 个答案:

答案 0 :(得分:3)

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

单个setTimeout

策略:每秒唤醒并检查大量匹配,更新完成的匹配。如果您有多个服务器,则可以阻止其中一个服务器通过synced-cron进行检查。

这种策略的优点是它可以直接实现。缺点是:

  1. 您最终可能会进行大量不必要的数据库读取。
  2. 您必须非常小心,您的处理时间不会超过支票之间的时间长度(一秒钟)。
  3. 如果您确信可以控制运行时,我建议您使用此策略。例如,如果您可以在endTime上为匹配编制索引,那么在每个周期中只需要检查几个匹配项。

    多个setTimeouts

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

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

    1. 实施可能有点棘手。例如。你必须考虑服务器重启时会发生什么。
    2. 天真的实现并没有超过单个服务器(见1)。
    3. 如果您认为在可预见的将来使用单一服务器,我建议您使用此策略。


      鉴于您提出的选择,这些是我发生的权衡。更强大的解决方案可能涉及流星/ mongo堆栈之外的技术。例如,将匹配时间存储在redis中,然后监听keyspace notifications

答案 1 :(得分:1)

老实说,这是一个偏好的问题。

我非常喜欢编写小型独立程序,每个程序都做一件事,做得好。如果您也是这样,那么编写单独的程序以通过cron定期运行可能会更好。

通过这种方式,您可以获得当时OS控制的精度,以及在Web应用程序环境之外易于调试的小型简单程序。

这只是一个偏好。