Skip to content

Day 7 — 超时与容错机制(Timeout)

学习目标

在框架的各关键环节引入超时控制,防止慢请求、网络异常等导致资源耗尽。

三个超时维度

1. 连接超时(ConnectTimeout)

客户端拨号时的超时控制:

go
conn, err := net.DialTimeout(network, address, opt.ConnectTimeout)

通过 Option.ConnectTimeout 配置,默认 10 秒。

2. 调用超时(Context)

客户端调用时通过 context.Context 传入超时:

go
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
client.Call(ctx, "Service.Method", args, &reply)

内部通过 select 同时监听 context 和调用完成。

3. 处理超时(HandleTimeout)

服务端处理请求的超时控制:

go
// Option 中设置
opt := &codec.Option{HandleTimeout: 2 * time.Second}

服务端在 handleRequest 中使用 time.After + select 实现:

  • 处理在超时前完成 → 正常返回
  • 超时 → 返回超时错误给客户端

Option 超时字段

字段作用默认值
ConnectTimeout客户端建立连接的超时10s
HandleTimeout服务端处理请求的超时0(无限制)

关键代码

超时逻辑分布在:

  • client.godialTimeout(连接超时)、Call(context 超时)
  • server.gohandleRequest(处理超时)

运行

bash
go run ./day7-timeout/example/