标准答案

  1. ReadHeaderTimeout 防慢头攻击,ReadTimeout 覆盖读取请求体的时间边界。
  2. WriteTimeout 保护服务端写响应的时间,但流式长响应要谨慎配置。
  3. IdleTimeout 限制 keep-alive 连接空闲时间,避免连接长期占用资源。
  4. 超时发生后要释放连接、取消下游并返回可诊断的日志,不重复执行不可幂等写操作。

题目解析

ReadHeaderTimeout 防慢头,ReadTimeout 包含请求读取,WriteTimeout 保护响应写入,IdleTimeout 保护 keep-alive 空闲连接。每个超时针对不同资源阶段,不能用一个值覆盖所有业务。

上传、流式下载和长轮询需要与代理、客户端和下游共享 deadline;WriteTimeout 过短会截断合法流,过长又会让慢客户端占用连接。

超时只是时间保护,仍要限制请求体大小、连接数和并发,并在取消后释放资源、记录结果未知和避免盲目重试。

常见误区

  • 误区:所有 timeout 设成零表示安全。改正:无限等待会耗尽连接和 goroutine,应按阶段设置有限预算。
  • 误区:流式下载使用过短 WriteTimeout。改正:按数据速率、客户端和代理契约设置,或采用分块/异步下载。
  • 误区:ReadHeaderTimeout 能替代请求体大小限制。改正:另外限制 Content-Length、实际读取字节和上传并发。

作者信息