NodeJS v12.18.1环境下setInterval运行数天后无故停止执行问题咨询
问题原因排查与结论
在Node.js v12.18.1版本中确实存在setInterval偶发停止回调的已知问题,不属于你提到的v10版本修复的25天计数溢出问题,问题根源在于该版本的定时器队列调度逻辑存在缺陷:
- 当事件循环同一时间点存在大量到期定时器、同时有高优先级IO事件抢占调度资源时,长周期的
setInterval实例会偶发从调度队列中丢失,后续不会再触发回调 - 该问题和运行时的事件循环负载强相关,所以你使用libfaketime单纯修改系统时间无法复现
复现方法参考
你可以通过模拟高负载事件循环场景提升复现概率:
- 保留原有
setInterval的ping逻辑 - 额外启动1000个间隔10ms的空回调
setTimeout循环,模拟短周期定时器抢占 - 同时启动高频本地TCP请求,模拟IO事件负载
该场景下通常运行1-3天即可复现setInterval停止回调的问题。
为什么node-cron可以正常运行
node-cron底层采用每次执行完成后重新注册新setTimeout的实现逻辑,每次调度都是全新的定时器实例,不会受旧定时器队列异常的影响,而setInterval是单次注册后重复调度,一旦被移出队列就会彻底停止运行。
内容的提问来源于stack exchange,提问作者Thabet Sabha
相关产品推荐
相关产品推荐

