标准答案
- HTTP 设置连接、响应头、响应体和总 deadline,客户端断开时取消下游。
- 文件和 Stream 设置读取、写入和空闲限制,并处理错误和 close。
- 子进程设置执行时间、输出上限、信号和退出码,避免命令挂死或输出撑爆内存。
- 超时后的业务状态要可查询,不能把“客户端没等到”当作“操作没有发生”。
题目解析
HTTP socket、文件句柄、子进程和任务执行槽都是有限资源,没有超时就可能永久占用并造成池耗尽。要分别设置连接、响应、空闲、输出和总 deadline,而不是只设一个外层计时器。
超时后要取消或终止可控资源,释放 socket、Buffer、文件和子进程;无法强制终止的外部副作用要记录结果未知,并通过状态查询或补偿收敛。
重试必须共享同一预算并受幂等约束。客户端没等到结果不等于操作没发生,支付、扣库存和提交任务不能因为 timeout 就无条件重放。
常见误区
- 误区:只在最外层设置 timeout。改正:按连接、头、体、执行和总 deadline 分层设置,并把剩余预算传给下游。
- 误区:超时后不释放 socket 或 child process。改正:执行 abort/kill/close,并记录无法取消的任务状态。
- 误区:超时就盲目重复不可幂等操作。改正:先查询最终状态或使用幂等键,再决定是否安全重试。