Nodejs上的多个setTimeouts

时间:2019-06-25 03:51:05

标签: node.js timer scheduled-tasks

我正在尝试在我的应用中实现自动取消订单功能。因此,我正在考虑在Node上添加setTimeouts,这将在给定的时间取消用户的订单。

我尝试在应用程序中添加计时器,但约束太多。

多个setTimeouts会降低我们服务器的性能吗?

2 个答案:

答案 0 :(得分:1)

  

多个setTimeouts会降低我们服务器的性能吗?

不,它不会降低速度,不会超过每个计时器运行时使用的CPU时间。

node.js中的计时器设计专门用于很好地管理大量计时器。拥有许多计时器应该没有问题(几万个就可以了)。有一个排序的计时器列表,它仅使用实际的操作系统级别的计时器或“下一个”计时器事件来触发。当该事件触发时,它将获取列表中的下一个事件并为该事件设置操作系统级别计时器。创建新计时器后,它将插入到已排序的列表中,如果它现在不是列表中的第一个计时器,它将等待其轮换,直到它成为列表中的第一个计时器。

也就是说,您实际上不一定为每个订单“需要”单独的计时器。由于您不需要毫秒级或什至分钟级的精度,因此您可以维护一个未完成订单的列表,并带有上次修改时间的时间戳,然后您可以使用一个间隔计时器,每隔几分钟运行一次,仅检查哪些订单有超出了您的非活动时间,应将其取消。如果订单列表是按时间戳排序的,那么您只需要检查最后几笔订单,直到找到不再需要取消的订单即可。

答案 1 :(得分:1)

使用议程而不是setTimeouts。

议程使用MongoDB数据库保留计划的任务(以及任务所需的参数),以便即使服务器关闭,任务仍将在指定的时间或间隔运行。

参考文献:

https://thecodebarbarian.com/node.js-task-scheduling-with-agenda-and-mongodb

https://medium.com/hacktive-devs/nodejs-scheduling-tasks-agenda-js-4b6824f9457e