消息队列三大难题:重复消息、乱序、丢消息。RocketMQ 怎么解决?幂等消费、顺序消息、事务消息——生产级方案一篇讲透。
一、消息重复原因
消息重复的三个来源:
1. Producer 重试
Producer → Broker:发送消息
Broker → Producer:ACK(网络丢包)
Producer → Broker:重试(同一消息发两次)
→ Broker 已写入两条
2. Consumer Rebalance
Consumer A 消费 msg-1, msg-2(未提交 Offset)
Rebalance → msg-1, msg-2 分给 Consumer B
Consumer B 重新消费 msg-1, msg-2
→ 重复消费
3. Consumer 处理成功但 Offset 提交失败
Consumer 消费 msg-1 → 处理成功 → 提交 Offset 失败
Consumer 重启 → 从旧 Offset 开始消费
→ msg-1 重复消费
结论:消息重复不可避免,必须在消费端做幂等
2026/7/3大约 8 分钟