退避策略 (backoff)
指数退避加随机抖动的重试延迟计算模块,用于网络请求、设备重连等需要逐步增加重试间隔的场景。
原理
每次调用 backoff_next() 时,先基于当前 delay 计算一个 [0, delay] 范围内的随机值作为返回值,然后再更新 delay(指数增长)。随机抖动可以避免多个客户端同时重试造成"惊群"。
数据结构
struct backoff_t {
int max_delay; /* 最大延迟上限(毫秒) */
int max_retry; /* 最大重试次数,<=0 表示无限制 */
int delay; /* 当前延迟基准值(毫秒) */
int retry; /* 已重试次数 */
};
API
void backoff_init(struct backoff_t * ctx, int delay, int max_delay, int max_retry);
初始化退避上下文。delay 为初始延迟,max_delay 为延迟上限,max_retry 为最大重试次数(<=0 表示无限制)。delay 会被限制在 [0, max_delay] 范围内。
int backoff_next(struct backoff_t * ctx);
获取下一次重试的等待时间(毫秒)。基于当前 delay 计算返回值后再更新 delay。达到最大重试次数后返回 -1。
增长策略
每次调用 backoff_next() 后,delay 按以下规则更新:
| 条件 | 更新方式 |
|---|---|
delay < max_delay / 2 | delay += max(delay, 1)(当 delay >= 1 时等价于翻倍) |
delay >= max_delay / 2 | delay = max_delay(封顶) |
其中阈值 max_delay / 2 为整数右移计算(max_delay >> 1),例如 max_delay = 1000 时阈值为 500。