轮询比设置多个 setTimeout() 更好的选择

Is polling a better option than setting multiple setTimeout()

我正在开发一个电子邮件提醒系统,以便在任务到期前 24、8、3 和 1 小时通知用户。

我有一个在 Node.js 上运行的服务器。我的第一个想法是每次为用户分配任务时设置四个单独的 setTimeout()。但是,我认为在服务器上闲置数百个 setTimeout() 并不是最佳性能。

因此,我是否最好每五分钟轮询一次未完成的任务,并向任务临近截止日期的用户发送提醒?这里的缺点是我会每五分钟阅读一整本 MongoDB 合集。

Nodejs 非常高效,有很多很多计时器。您可以轻松拥有数以万计的计时器,而不会产生任何有意义的后果。它使用一个排序的链表,只需要很少的时间来插入一个新的计时器,并且一旦插入就不需要任何费用。

只有下一个在列表开头触发的计时器才会在事件循环中定期进行比较。当它触发时,它会从链接列表的前面移除,列表中的下一个计时器现在位于头部。因为它是一个链表,触发计时器并将其从链表开头移除的时间与链表的长度无关(例如,它不是必须向下复制的数组)。

因此,对于您的特定应用程序,提高数据库效率(尽可能少的请求)远比减少计时器数量重要得多。所以,无论哪个定时器 design/implementation 优化你的数据库负载都是我推荐的。


仅供参考,如果您想提醒用户 4 次有关即将到期的任务,您仍然只能在每个任务的时间使用一个计时器。将第一个计时器设置为触发,然后当它触发通知时,您对之前保存的截止日期 date/time 进行一点时间计算,看看何时设置下一个计时器。这将使您每项任务只有一个计时器,而不是四个。

但是,这里的重点仍然是您应该首先优化设计以有效使用数据库。

而且,计时器不是永久性的,所以如果您的服务器重新启动,您需要一种机制来在服务器启动时重新创建适当的计时器(可能是一个数据库查询,为您提供在特定时间内未决的任何任务)。