从一次线上事故看 Node.js 中 process.nextTick 与 setImmediate 的真实执行顺序
线上服务偶尔出现日志顺序错乱,排查发现是一个模块在初始化时用 process.nextTick 注册了清理逻辑,同时又用 setImmediate 触发了上报任务。开发同学凭直觉认为 nextTick 是“微任务”,setImmediate 是“宏任务”,所以 nextTick 一定先执行。但在某次高并发时,日志显示上报任务先于清理逻辑跑完了,导致请求上下文被提前释放,报了内存泄漏警告。这个问题不是简单的 API 记忆能解决的,它牵扯到 Node.js 事件循环中不同阶段的轮转规则,以及 nextTick 队列和 Promise 微任务队列在同一个 tick 内部的交错方式。下面从实际测试代码...