第10篇:消息不重 + 不乱 —— 幂等消费、顺序保证与死信队列实战系列:Kafka × Spring Boot:参数精讲与生产落地实战本篇关键词:重复消费 · 幂等性 · 消息顺序 · 死信队列 ·DefaultErrorHandler· 指数退避📌 本篇导读上一篇解决了"消息不丢"。本篇解决另外两个经典问题:消息会不会重复消费?几乎无法 100% 避免,但可以通过幂等设计消除影响。消息顺序会不会乱?Kafka 只保证分区内有序,如何在业务层利用这个保证?处理失败的消息怎么办?无限重试?直接丢弃?还是发死信?一、重复消费的根因根因1:手动提交 Offset 前崩溃 Consumer A 处理完 msg1~msg3,服务崩溃(Offset 未提交) 重启后重新消费 msg1~msg3 → 重复! 根因2:Rebalance 期间 Consumer A 处理了 msg1 但未提交 Offset Rebalance 发生,Partition 转给 Consumer B Consumer B 从上次提交的 Offset 开始 → msg1 被重复消费! 根因
第10篇 消息不重 + 不乱:幂等消费与死信队列
第10篇:消息不重 + 不乱 —— 幂等消费、顺序保证与死信队列实战系列:Kafka × Spring Boot:参数精讲与生产落地实战本篇关键词:重复消费 · 幂等性 · 消息顺序 · 死信队列 ·DefaultErrorHandler· 指数退避📌 本篇导读上一篇解决了"消息不丢"。本篇解决另外两个经典问题:消息会不会重复消费?几乎无法 100% 避免,但可以通过幂等设计消除影响。消息顺序会不会乱?Kafka 只保证分区内有序,如何在业务层利用这个保证?处理失败的消息怎么办?无限重试?直接丢弃?还是发死信?一、重复消费的根因根因1:手动提交 Offset 前崩溃 Consumer A 处理完 msg1~msg3,服务崩溃(Offset 未提交) 重启后重新消费 msg1~msg3 → 重复! 根因2:Rebalance 期间 Consumer A 处理了 msg1 但未提交 Offset Rebalance 发生,Partition 转给 Consumer B Consumer B 从上次提交的 Offset 开始 → msg1 被重复消费! 根因