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

标签 javascript node.js mongodb settimeout polling

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

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

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

最佳答案

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

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

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


仅供引用,如果您想就一项即将到期的任务提醒用户 4 次,您仍然只能在每项任务中同时启用一个计时器。将第一个计时器设置为触发,然后当它触发通知时,您可以对之前保存的到期日期/时间进行一些时间计算,并查看何时设置下一个计时器。这将使您每项任务只有一个计时器,而不是四个。

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

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

关于javascript - 轮询比设置多个 setTimeout() 更好的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69024109/

相关文章:

javascript - Typescript 3 Angular 7 StopPropagation 和 PreventDefault 不起作用

angularjs - npm install - Windows 中的 g generator-gulp-angular 错误

node.js - 自动化 Jasmine-Node 和 express.js

arrays - 如何从 MongoDB 中的所有子数组中删除元素

mongodb - 如何在mongoDB与python集成中编写原子操作

javascript - MongoDB - 多个查询和单个文档结果

javascript - HTML 字段一旦无效就不会再次验证

c# - javascript 验证电子邮件格式接受不正确的电子邮件格式@abcd.com.gmail,

javascript - 模型端口的 JointJS 2.2.1 样式

node.js - NPM 不更新自述文件