基本定义
Backoff(退避)是一种在系统遇到错误或资源争用时,通过延迟重试来避免持续失败或加重系统负担的策略。
最常见的形式是 指数退避(Exponential Backoff):每次重试之间的等待时间呈指数增长(如 1s、2s、4s、8s...)。
典型应用场景
- 网络请求重试:当 API 调用失败(如 503 服务不可用),客户端可采用 backoff 策略稍后再试。
- 分布式系统协调:多个节点竞争同一资源时,通过退避减少冲突。
- 数据库连接池:连接失败后不立即重连,而是等待一段时间再尝试。
- 消息队列消费:消费失败的消息可延迟重新入队,避免“忙等”。
简单示例(伪代码)
delay = 1 // 初始延迟 1 秒
max_delay = 60 // 最大延迟 60 秒
while (尝试失败) {
等待 delay 秒
重新尝试操作
delay = min(delay * 2, max_delay) // 指数退避,但不超过上限
}
为什么需要 Backoff?
如果没有退避机制,系统在高负载或临时故障时可能因大量即时重试而雪崩。Backoff 能有效:
- 降低服务器压力
- 提高整体成功率
- 避免资源浪费
- 提升用户体验(避免卡死)