处理node中大量任意调度的任务

问题描述

前提:我有一个类似日历的系统,允许在未来的预定时间创建/删除“事件”。最终目标是在事件开始之前和开始时执行操作(发送消息/提醒)。我进行了一些搜索并缩小了范围,找到了似乎是我最可行的两个选择

  • Unix Cron 作业
  • Bree

不过,我不太确定哪种最适合我的最终目标,此外,感觉必须有一些其他既定的方法来做这样的事情,而我只是没有正确的知识,或者我完全跳过了。

我的问题:

  • 如果从理论上讲,系统要处理任意数量的“事件”,而且都是在未来任意时间处理的,那么从系统资源角度来说,这些选项中哪个更实用?我在这方面的担忧是否有效?

  • 用大量作业填充 crontab 是否有任何可预见的问题 - 或者,在 bree 的情况下,调度大量作业?

  • 到目前为止我完全错过了一个更好的主意吗?

这主要源于 bree 对节点“工作线程”的使用。我对这个概念很陌生 并且担心由于每个工作都会产生一个“工作线程”,因此我可以很快地占用所有可用线程并进行研磨......停止某些事情。然而,这听起来有些愚蠢且可能是错误的(可能表明我在这里完全缺乏知识),因此,我的问题。

谢谢,斯塔克。

解决方法

对于类似日历的系统,您似乎可以查询数据库以查找下一小时内发生的所有事件,然后为每个事件创建一个 setTimeout()。然后,一个小时后,再次做同样的事情。然后,在任何服务器重新启动时,再次执行相同的操作。你真的不需要担心不是迫在眉睫的事件。他们可以坐在数据库中直到他们的时间之前不久。您只需要一种有效的方法来查询数据库以查找即将发生的事件并为它们使用计时器。

WorkerThreads 在 nodejs 中是相当重量级的项目,因为它们创建了一个完整的独立堆和一个全新的 V8 解释器实例。您绝对不希望每个事件都有一个单独的 WorkerThread。


我应该补充一点,nodejs 中的计时器是非常轻量级的项目,拥有大量计时器不是问题。它们只是存储在一个排序的链表中,随着列表变长,只有插入新计时器需要更多时间(在添加到列表时进行插入排序)。没有连续的运行时开销,因为有很多计时器。事件循环,然后只检查链表中的第一项,看看是否到了触发下一个计时器的时间。如果是,它将它从列表的头部移除并调用它的回调。如果没有,它会处理事件循环工作项的其余部分,并在下一个事件循环中再次检查列表中的第一项。