什么是 Backoff 算法?
Backoff(退避)算法是一种用于在网络通信、任务调度或资源争用等场景中, 在发生冲突或失败后延迟重试时间的策略。其核心思想是:避免立即重试导致系统雪崩, 而是通过逐步增加等待时间来缓解压力。
常见 Backoff 策略
- 固定退避(Fixed Backoff):每次重试间隔相同。
- 线性退避(Linear Backoff):重试间隔随次数线性增长。
- 指数退避(Exponential Backoff):重试间隔按指数增长,如 2ⁿ 秒。
- 带抖动的指数退避(Exponential Backoff with Jitter):在指数基础上加入随机因子,避免“雷群效应”。
典型应用场景
- API 请求失败后的自动重试
- 分布式锁竞争
- 消息队列消费失败处理
- 数据库连接池重连机制
简单 JavaScript 示例
// 指数退避重试示例
function retryWithBackoff(fn, retries = 3, delay = 1000) {
return fn().catch(err => {
if (retries <= 0) throw err;
return new Promise(resolve => setTimeout(resolve, delay))
.then(() => retryWithBackoff(fn, retries - 1, delay * 2));
});
}