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

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

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

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

解决重复消息的问题

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

  • 唯一消息 ID + 去重表

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

  • 数据库乐观锁

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

相关推荐
吉甫作诵15 小时前
Kafka 集群安装与运维实战:消费组排查、Offset 重置与副本重分配
大数据·运维·分布式·kafka·消息队列
happy_king_zi2 天前
kafka两种部署模式的区别
kafka·消息队列·sre
happy_king_zi2 天前
Kafka 3.9.2 KRaft 模式三节点集群完整部署指南
kafka·消息队列
szephyr3 天前
消息队列入门:RabbitMQ 和 Kafka 到底怎么选,什么时候不该用
后端·架构·kafka·消息队列·rabbitmq
hey you~4 天前
云客服会话数据实时同步,数据库架构怎么设计?
消息队列·数据库架构·高可用·实时同步·最终一致性·云客服·会话数据
用户531397318174 天前
[Kafka源码揭秘] 消息写入全链路:网络IO与请求入队
kafka·消息队列
hey you~6 天前
云客服多渠道统一接入,消息队列技术实现方案
kafka·消息队列·rocketmq·系统集成·云客服·多渠道接入·接口对接
滕州市燕猫虎计算机科技工作室个体工商户7 天前
RabbitMQ和RocketMQ
消息队列·mq
Lucis__7 天前
基于责任链模式的消息队列—异步处理流水线的最佳实践
linux·c++·消息队列·责任链模式·ipc
letisgo510 天前
JAVA 高级进阶10篇《消息队列实战:RocketMQ/Kafka选型与“不丢不重有序“三连解》
java·面试·kafka·消息队列·rocketmq