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

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

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

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

解决重复消息的问题

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

  • 唯一消息 ID + 去重表

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

  • 数据库乐观锁

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

相关推荐
利刃大大28 分钟前
【RabbitMQ】安装详解 && 什么是MQ && RabbitMQ介绍
分布式·中间件·消息队列·rabbitmq·mq
indexsunny4 小时前
互联网大厂Java求职面试实战:Spring Boot微服务与Redis缓存场景解析
java·spring boot·redis·缓存·微服务·消息队列·电商
技术小泽2 天前
MQTT从入门到实战
java·后端·kafka·消息队列·嵌入式
遇见火星3 天前
RabbitMQ 高可用:HAProxy 负载均衡实战指南
分布式·消息队列·rabbitmq·负载均衡·haproxy
闲人编程3 天前
电商平台用户系统API设计
数据库·后端·消息队列·fastapi·监控·容器化·codecapsule
indexsunny3 天前
Java互联网大厂面试实战:Spring Boot、微服务与Kafka在电商场景中的应用
java·spring boot·微服务·kafka·消息队列·电商·数据库事务
bkspiderx4 天前
RabbitMQ 全面技术指南
分布式·消息队列·rabbitmq
蜂蜜黄油呀土豆4 天前
Redis 不只是缓存:高并发场景下的多种核心应用实践
redis·消息队列·分布式锁·缓存设计
开着拖拉机回家4 天前
【消息队列】kafka2.0.0安装(单机)及基本命令
运维·kafka·消息队列·服务注册·生产者消费者·服务开机自启
用户9446814013504 天前
Kafka如何解决消息重复与乱序?详解Kafka的幂等机制!
后端·消息队列