SC200 表示关闭截止时间到了,一个进行中的请求仍未结束。它既没有完成,也没有失败,连接一直开着。
| 诊断码 | SC200 FAIL |
|---|---|
| 阶段 | 进行中请求的响应 |
| CLI 退出码 | 1 |
| 含义 | 收到 SIGTERM 时正在运行的请求,没有在关闭截止时间前完成。 |
| 输出信息 |
|
| 首先检查 | 用 server.close() 停止接受连接,让未完成的请求完成;不要等待永远不会结束的 keep-alive socket 或定时器。 |
请求为什么会卡住?
- 关闭处理函数在等请求结束,而请求又在等关闭时的清理完成。
- 某个数据库调用、上游请求或锁一直没有结束。
- 服务器停止了读写,却没有关闭响应。
shutdown.deadlineMs比这个操作预期需要的时间短。- 某个定时器或流没有关闭。
如何修复?
- 在慢的处理函数和每个关闭步骤前后加日志。
- 先让进行中的处理函数完成,再关闭它们依赖的资源。
- 给网络、数据库和队列操作设置超时。
- 把
deadlineMs设得比最慢的正常请求更长,但要短于平台的强制终止时限。
不要用 process.exit() 来消除这个诊断码。这样会切断连接,把失败变成 SC201。
如何确认已修复?
时间线中应在截止时间之前出现 work request finished。如果一个看起来正常的响应仍可能掩盖没做完的工作,就加上 bodyIncludes。
用最慢的正常操作来测试,不要只用固定的 sleep。如果外部系统可能卡住,把它们自己的超时处理路径作为单独的失败场景来测试。