在微服务和高并发场景中,服务的可用性、稳定性和健壮性至关重要。Go 语言虽然轻量高效,但在容错策略方面缺少一站式解决方案。为此,我开源了 Resilience ------ 一个 Go 原生实现的高可用策略库,支持重试、熔断、隔离、超时和回退等策略组合。
本文将带你全面了解这个库的设计理念、核心实现和使用方式。
一、项目背景
在实际生产中,常见的容错场景包括:
- 服务偶发失败:网络抖动或依赖服务短暂不可用
- 请求超时:希望在一定时间内完成操作
- 并发控制:限制某些操作的最大并发数,防止雪崩
- 熔断:连续失败时快速失败,保护后端服务
- 回退:操作失败时提供默认返回或备用方案
为了应对这些场景,我实现了 Resilience 库,它可以在 Go 项目中轻松组合各种策略,保证服务的稳定性和可用性。
二、核心策略
1. Retry(重试)
go
retry := NewRetry(3).
Handle(func(err error) bool { return err != nil }).
WithBackoff(ExponentialBackoff{Base: 100*time.Millisecond})
- 支持最大重试次数或无限重试
- 可自定义重试条件和回调
- 支持多种退避策略(固定、指数、随机)
2. Timeout(超时)
bash
timeout := NewTimeout(50 * time.Millisecond)
- 支持乐观模式(基于 context 取消)
- 支持悲观模式(无视函数行为强制超时)
- 可设置超时回调
3. Fallback(回退)
go
fallback := NewFallback(func(ctx context.Context) error {
// 默认返回或备用逻辑
return nil
})
- 支持自定义错误条件
- 支持回调函数
- 可与其他策略组合使用
4. Bulkhead(隔离/并发控制)
css
bulkhead := NewBulkhead(5, 10).OnRejected(func(ctx context.Context) {
fmt.Println("请求被拒绝,已达到最大并发")
})
- 限制最大并发执行数
- 支持排队队列
- 支持拒绝回调
5. CircuitBreaker(熔断器)
go
cb := NewCircuitBreaker(3, 50*time.Millisecond).
OnBreak(func(err error, dur time.Duration){ fmt.Println("熔断触发") }).
OnReset(func(){ fmt.Println("熔断重置") }).
OnHalfOpen(func(){ fmt.Println("HalfOpen 状态") })
- 支持失败次数阈值
- 支持开闭半开状态切换
- 支持回调函数
6. WrapPolicy(策略组合)
go
wrapped := Wrap(retry, timeout, fallback, bulkhead, cb)
err := wrapped.Execute(context.Background(), func(ctx context.Context) error {
return callRemoteService()
})
- 支持多策略组合
- 执行顺序从内向外
- 可实现复杂容错链路
三、性能与基准测试
核心策略性能如下:
| 策略 | ns/op | allocs/op |
|---|---|---|
| Retry (单次) | 7 ns | 0 |
| Fallback | 5 ns | 0 |
| Bulkhead 并发 | 12 μs | 0 |
| CircuitBreaker 并发 | 168 ns | 0 |
- 零内存分配,极低开销
- 并发安全,适合高 QPS 场景
完整基准测试已集成在项目仓库,可直接使用:
bash
go test -bench=. -benchmem ./resilience
四、使用场景
- 微服务调用保护:结合 Retry + Timeout + CircuitBreaker
- 高并发请求隔离:使用 Bulkhead 控制服务压力
- 降级策略:Fallback 提供默认值或备用逻辑
- 组合策略管道:WrapPolicy 实现复杂策略组合
示例:
scss
wrapped := Wrap(
NewRetry(3),
NewTimeout(100*time.Millisecond),
NewFallback(func(ctx context.Context) error { return nil }),
NewBulkhead(10, 5),
NewCircuitBreaker(5, 1*time.Second),
)
五、开源仓库
- GitHub: github.com/HongFeng-Ch...
- 支持 GoDoc 文档自动生成
六、总结
Resilience 是一个 工业级 Go 高可用策略库:
- 支持 Retry、Timeout、Fallback、Bulkhead、CircuitBreaker 等策略
- 高性能、零内存分配
- 并发安全
- 支持策略组合,易于扩展
未来计划:
- 增加 OpenTelemetry 指标支持
- 支持更多 Backoff 策略
- 提供策略链路可视化工具
💡 如果你的 Go 项目需要微服务容错、熔断、降级或高并发控制,Resilience 可以直接提升系统稳定性。