在节点中处理大量任意调度的任务

Handling large amounts of arbitrarily scheduled tasks in node

前提:我有一个类似日历的系统,允许在未来的预定时间creation/deletion of 'events'。最终目标是在事件开始前和事件开始时执行操作(发送 message/reminder)。我已经进行了一些搜索并缩小了范围,似乎是我的两个最可行的选择

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

我的问题:

这主要源于bree对node的使用'worker threads'。我对这个概念很陌生 并担心由于每个作业都会产生一个 'worker thread',我可以很快地占用所有可用的线程并研磨......一些东西,停止。然而,这听起来有些愚蠢而且可能是错误的(可能表明我完全缺乏这方面的知识),因此,我的问题。

谢谢,斯塔克。

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

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


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