长时间 HTTP 任务中的代理空闲超时
当长时间的服务器工作触及代理的空闲上限时,选择轮询或明确规定的流式格式,而不是把任意字节插入最终响应。
如果某项服务沉默数分钟而代理超时,请在添加心跳字节之前先选择客户端应当收到什么。延长定时器可以帮助某一次等待;响应契约决定哪种进度是有效的。
| 应用设计 | 进度契约 |
|---|---|
| 异步任务 | 202 Accepted,附带描述监控的表示,随后是有限的状态请求和明确的完成/失败状态 |
| Server-Sent Events 流 | Content-Type: text/event-stream 以及 SSE 客户端能理解的记录 |
202 并不承诺任务会成功。对于 SSE,注释记录可能如下所示:
: heartbeat
冒号使它成为注释而不是应用事件。HTML 的编写说明建议大约每 15 秒发送一次周期性注释,以应对某些旧的代理空闲行为;这是指导,不是通用超时保证。
完成响应头,并确保应用/服务栈释放记录,而不是在本地缓冲它们。尚未发送的字节无法让下游中间层保持活跃。
不要把 SSE 注释插入普通 JSON 或二进制内容。HTTP/1.1 的零长度块会结束分块正文,因此它不是可重复的空心跳。
保留操作截止时间和取消策略。仅凭流量活动不能表明有用的任务进度或有效的最终结果。