重试退避
重试退避(retry backoff):消息发送失败后,不要立刻马上重试,先等待一段间隔时间,再发起下一次重试,这个等待时间就叫退避时间。
你这段是 Kafka 生产者的配置,我拆开用通俗话讲清楚。
配置回顾
retries=3:最多重试3次(加上原始第1次发送,最多一共尝试4次)retry.backoff.ms=500:两次重试之间,等待500毫秒enable.idempotence=true:幂等性delivery.timeout.ms=120000:整个发送流程最长120秒,超时直接失败
1. 先理解:没有退避会发生什么(重试风暴/惊群效应)
假设 Broker(Kafka服务)挂了,成千上万个生产者客户端发消息全部失败。
- 如果没有退避:一旦 Broker 恢复,所有客户端一瞬间同时发起重试请求
- 大量请求同时涌进来,刚重启好还很脆弱的 Broker,瞬间又被打崩,这就是重试风暴、惊群
2. retry.backoff.ms=500 的作用
失败之后,等500ms,再重试下一次。
这样各个客户端重试的时间点就错开了,流量被摊开,不会全部挤在同一个瞬间冲击服务。
⚠️ 注意:Kafka这个是固定退避,每次都等500ms;还有一种叫指数退避(第一次等500ms,第二次1000ms,第三次2000ms,越来越久),这里不是指数,是固定间隔。
3. retries=3:最多重试3次
原始发送算第1次,如果失败:
重试1 → 等500ms → 重试2 → 等500ms → 重试3
3次重试用完还失败,就不再重试。
不是无限循环,防止永久重试卡死。
4. enable.idempotence=true 幂等性,解决重试带来的重复消息
重试有一个坑:
生产者发消息,Broker收到并且保存成功了,但是网络返回丢包。
生产者这边看到“发送失败”,于是发起重试,同一条消息又发一遍。
如果没有幂等,Broker会存两条一模一样的消息,下游消费就重复了。
开启幂等之后:
Kafka生产者自带序列号,Broker识别出这是重复重试的同一条消息,只保存一条,丢弃重复请求,保证消息不会重复写入。
5. delivery.timeout.ms=120000(120秒兜底)
就算重试3次还没跑完,如果整个发送流程耗时超过120秒,直接判定发送失败,不再继续等待重试。
失败之后走业务回调:告警 + 消息投递到死信队列DLQ,人工处理,避免消息丢失。
整体流程串一遍
- 生产者发送消息给Broker
- 发送失败(网络抖动、主从切换、Broker宕机)
- 判断:重试次数是否≤3
- ✅ 还有重试额度:等待500ms(退避),再重试发送;幂等机制防止重复入库
- ❌ 重试用完 / 总耗时超过120秒:直接失败,消息进DLQ,告警
- 退避时间分散大量客户端的重试时间,避免Broker恢复瞬间被流量打垮(防止重试风暴)
名词精简
- 重试退避:失败后等待一段时间再重试,错开请求时间
- 重试风暴(惊群):大量客户端同一时刻一起重试,压垮服务
- 幂等生产者:重试不会产生重复消息
- DLQ死信队列:多次重试依然失败的消息,单独存放,人工排查
1674



被折叠的 条评论
为什么被折叠?



