主题
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.go:dialTimeout(连接超时)、Call(context 超时)server.go:handleRequest(处理超时)
运行
bash
go run ./day7-timeout/example/