← 中文资源

简体中文版本

添加请求超时包装器

在 Node.js 中执行每请求截止时间,把取消传播到下游调用,并返回明确的 503 而不是一直占用连接。

阅读英文原文

为什么响应超时不够

返回 503 而数据库查询仍在运行,只保护了客户端,没有保护服务器。查询仍占用连接和内存。有用的超时有两部分:控制响应的截止时间,以及到达下游操作的取消。处理器接受 signal 时,包装器同时处理两者。

传播 signal

把 signal 传给 fetch、数据库驱动和队列客户端。对不支持取消的库,设置库级超时并记录缺口。signal 中止后不要启动新工作;在昂贵步骤前检查 signal.aborted。

if (signal.aborted) throw new Error('request cancelled');

验证失败路径

添加一个等待超过超时的测试路由,断言响应为 503、处理器停止、日志中没有未处理拒绝。再测试快速路由,确认计时器被清除且不会阻止进程退出。泄漏计时器的超时可能阻止干净关闭。

验证超时

预期结果:慢路由在截止时间返回 503,下游调用被取消,快速路由不受影响。用可控延迟的测试依赖确认,并检查进程在空闲后能正常关闭。