第10篇 消息不重 + 不乱:幂等消费与死信队列

Source

第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 被重复消费!

根因