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

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

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

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

解决重复消息的问题

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

  • 唯一消息 ID + 去重表

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

  • 数据库乐观锁

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

相关推荐
小坏讲微服务3 天前
Spring Cloud Alibaba整合 Kafka 的完整实现
分布式·spring cloud·kafka·消息队列·springboot·linq
C2H5OH6664 天前
RabbitMQ讲解-基础篇
spring cloud·消息队列·rabbitmq
A尘埃5 天前
Python消息队列:Celery + Redis RabbitMQ Apache Kafka
消息队列
我命由我123457 天前
Java 开发 - 简单消息队列实现、主题消息队列实现
java·开发语言·后端·算法·java-ee·消息队列·intellij-idea
sg_knight8 天前
RabbitMQ 中的预取值(prefetch)详解:如何真正提升消费端性能?
java·spring boot·spring·spring cloud·消息队列·rabbitmq·预取值
whltaoin11 天前
【微服务中间件】RabbitMQ 多平台安装搭建实践指南(Windows_macOS_Ubuntu_Docker 全场景)
微服务·中间件·消息队列·rabbitmq·多平台
AscentStream12 天前
案例实践 | Flipkart 异步总线如何实现不停机从 Kafka 迁移到 Pulsar
消息队列
little_xianzhong17 天前
三个常听到的消息/中间件MQTT RabbitMQ Kafka
java·笔记·中间件·消息队列
陈果然DeepVersion23 天前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(六)
spring boot·kafka·消息队列·向量数据库·java面试·rag·ai智能客服
陈果然DeepVersion23 天前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(二)
spring boot·kafka·消息队列·向量数据库·java面试·rag·ai智能客服