标准答案
- ReadHeaderTimeout 防慢头攻击,ReadTimeout 覆盖读取请求体的时间边界。
- WriteTimeout 保护服务端写响应的时间,但流式长响应要谨慎配置。
- IdleTimeout 限制 keep-alive 连接空闲时间,避免连接长期占用资源。
- 超时发生后要释放连接、取消下游并返回可诊断的日志,不重复执行不可幂等写操作。
题目解析
ReadHeaderTimeout 防慢头,ReadTimeout 包含请求读取,WriteTimeout 保护响应写入,IdleTimeout 保护 keep-alive 空闲连接。每个超时针对不同资源阶段,不能用一个值覆盖所有业务。
上传、流式下载和长轮询需要与代理、客户端和下游共享 deadline;WriteTimeout 过短会截断合法流,过长又会让慢客户端占用连接。
超时只是时间保护,仍要限制请求体大小、连接数和并发,并在取消后释放资源、记录结果未知和避免盲目重试。
常见误区
- 误区:所有 timeout 设成零表示安全。改正:无限等待会耗尽连接和 goroutine,应按阶段设置有限预算。
- 误区:流式下载使用过短 WriteTimeout。改正:按数据速率、客户端和代理契约设置,或采用分块/异步下载。
- 误区:ReadHeaderTimeout 能替代请求体大小限制。改正:另外限制 Content-Length、实际读取字节和上传并发。