如何处理消费过程中的重复消息

在消息传递过程中,如果出现传递失败的情况,发送方会执行重试,重试的过程中就有可能会产生重复的消息。

消费者在处理消息时崩溃,未及时发送ACK,或发送的ACK未到达Broker,也会导致重复消息。

对使用消息队列的业务系统来说,如果没有对重复消息进行处理,就有可能会导致系统的数据出现错误。

解决重复消息的问题

常见的解决方法是,在消费端,让消费消息的操作具有幂等性。幂等性指的是多次处理同一消息,结果与处理一次相同。实现幂等性的常见方法:

  • 唯一消息 ID + 去重表

    为每条消息分配唯一 ID(如 messageId 或业务唯一键),在 Redis/DB 记录已处理,在消费前检查是否已处理。可以使用数据库主键/唯一索引,也使用 Redis 的 SETNX。

  • 数据库乐观锁

    可以未数据增加一个版本号属性,每次更数据前,比较当前数据的版本号是否和消息中的版本号一致,如果不一致就拒绝更新数据,更新数据的同时将版本号 +1。

相关推荐
螺蛳粉 螺蛳粉3 天前
CDH第七篇:CDH 集成 Kafka 实战:CSD + Parcel 组合拳,先装 ZooKeeper 是铁律
物联网·zookeeper·kafka·消息队列·parcel·cdh集成·csd
我不会起名字3226 天前
Kafka 重复消费:自动提交位点与手动提交的 3 个错位
kafka·消息队列·幂等·排查
爱好曙光7 天前
NATS JetStream 消费者 ack 与重投递:重复消费治理实战
消息队列·幂等·ack·jetstream·nats
我不会起名字3228 天前
Kafka 顺序消息为什么乱了:分区数变化与重试的 3 类原因
kafka·消息队列·顺序·排查
Sayai9 天前
Kafka 磁盘空间治理实战:retention 保留策略、log.dirs 在线扩容、分区跨盘迁移与不停机整体换盘
大数据·运维·分布式·kafka·消息队列
张彦峰ZYF12 天前
一条消息的丢与重:Kafka 与 RabbitMQ 可靠投递的确认、位点、死信与幂等全链路
后端·kafka·消息队列·rabbitmq·isr·解耦与削峰·丢失与重复
做个文艺程序员13 天前
MQ第12篇:AI原生消息架构演进:从MQ到事件驱动的全链路设计
架构·消息队列·wpf·事件驱动架构·ai-native·cqrs
我不会起名字32214 天前
Kafka 分区数到底设几个:吞吐量、顺序性与 rebalance 代价的取舍
kafka·消息队列·调优·分区
我不会起名字32214 天前
Go 写 Kafka 消费者:sarama 的 3 个坑与优雅退出写法
kafka·消息队列·go·sarama
j7~18 天前
【仿 RabbitMQ 项目】发布订阅消息队列 (篇八):交换机数据管理模块,分层类设计、SQLite 回调原理与代码实现
服务器·网络·数据库·消息队列·交换机·交换机数据管理·sqlite回调原理