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

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

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

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

解决重复消息的问题

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

  • 唯一消息 ID + 去重表

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

  • 数据库乐观锁

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

相关推荐
陈果然DeepVersion20 小时前
Java大厂面试真题:Spring Boot微服务+Kafka消息队列+AIGC场景实战问答全解析
spring boot·redis·微服务·kafka·消息队列·aigc·java面试
Lemon程序馆2 天前
Kafka | Broker 工作原理
后端·kafka·消息队列
zyh200504302 天前
RabbitMQ概述
分布式·消息队列·rabbitmq·消息中间件·amqp
linweidong4 天前
多级缓存系统设计:从本地到分布式,打造高性能利器
分布式·缓存·消息队列·雪崩·java面经·击穿·消费端
沐浴露z7 天前
Kafka 生产者详解(上):消息发送流程与API,分区,吞吐量与数据可靠性
java·kafka·消息队列
在未来等你10 天前
Kafka面试精讲 Day 25:Kafka与大数据生态集成
大数据·分布式·面试·kafka·消息队列
在未来等你11 天前
Kafka面试精讲 Day 29:版本升级与平滑迁移
大数据·分布式·面试·kafka·消息队列
在未来等你11 天前
Kafka面试精讲 Day 30:Kafka面试真题解析与答题技巧
大数据·分布式·面试·kafka·消息队列
武话不港113 天前
RabbitMQ异常,handleDelivery方法异常
分布式·消息队列·rabbitmq