消息重复消费的问题

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 消息重复消费的问题

公众号merlinsea


消息重复消费问题介绍


   当消费者获取到消息并已经完成消费了以后,会发送ack给rabbitmq,然后rabbitmq就会将该消息标记为已经消费完成。但由于存在网络问题,消费者发送ack的时候可能存在发送失败,导致rabbitmq认为该消息没有成功被消费者消费,之后就会进行重新投递,导致消费者会多次收到同一条消息的可能性。


【由于网络问题,任何消息队列都可能存在消息重复消费的问题!!!】

640.jpg

如何解决消息重复消费的问题,即如何保证消息消费时的幂等性?

   

答:由于网络抖动的问题,需要在消费者端保障消息消费时候的幂等性。


   方法1:每次消费者收到消息的时候都将消息的id存入redis中,如果redis中已经存在这个消息的id了,说明是二次消费,则可以直接返回ack给消息队列,如果redis中不存在这个消息ID,那么说明是第一次消费,则可以进行消费,消费完成后就可以将消息存入redis,同时返回ack。

//Redis中操作,判断是否已经操作过 TODO
        boolean flag =  jedis.setNX(key);
        if(flag){
             //消费
         }else{
              //忽略,重复消费
         }

640.jpg


方法2:建立一个数据库去重表,这个表的字段就是message id,并将该字段作为唯一索引。这里是利用数据库的唯一索引不可重复的方法来判断之前是否消费过该消息。

   

说明点:


   是否需要添加额外的redis或者数据库表来保障消息消费时候的幂等性是看业务场景而定。比如说在某种业务场景下,消费者每次收到消息都是需要将数据库的某条记录的state改为“finish”,那么不论这条消息来多少次,其实【最终结果都是一致的】,因此也没必要额外引入redis来保障幂等性。但在有些场景下如果消费者每次监听到消息会导致业务的【最终结果每次都发生改变】,那么就需要单独引入redis保障消费消息时的幂等性。


update coupon_record set state='FINISH' where id =#{id}


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
12月前
|
消息中间件 数据库
RabbitMQ消息的重复消费问题如何解决的
RabbitMQ消息的重复消费问题如何解决的
1439 0
|
12月前
|
负载均衡 网络性能优化
EMQ如何保证消息不重复消费?
EMQ(Erlang MQTT Broker)通过以下机制来保证消息不重复消费
577 2
|
2月前
|
消息中间件 存储 Kafka
几种 MQ 顺序消息的实现方式
几种 MQ 顺序消息的实现方式
|
11月前
|
消息中间件 NoSQL Kafka
如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?
为了提高应用程序的性能和可扩展性,很多应用程序开始采用消息队列(MQ)来处理消息。 MQ 可以将消息异步地发送到目的地,从而实现解耦、异步处理和流量控制等功能。 但是,MQ 也带来了一些问题,如消息重复消费和消息消费的幂等性问题。 本文将介绍 MQ 如何保证消息不被重复消费,并讨论如何保证消息消费的幂等性。
|
11月前
|
消息中间件 存储 安全
RocketMQ-消息消费模式 顺序消费
RocketMQ-消息消费模式 顺序消费
179 0
|
12月前
|
消息中间件 Kafka 测试技术
MQ 学习日志(七) 保证消息消费的顺序性
保证消息消费的顺序性
147 0
|
12月前
|
消息中间件 Kafka
Kafka消息的重复消费问题如何解决的 ?
Kafka 通过使用消费者组(Consumer Group)来解决消息的重复消费问题。
1357 0
|
12月前
|
消息中间件 监控 NoSQL
Rabbmit 重复消费的问题
最近遇到一个奇怪的问题,消费者在批量消费消息时,遇到该批次中出现部分重复消费导致业务异常。这些异常集中在某一时刻附近。
164 0
|
12月前
|
消息中间件
RabbitMQ消息的重复消费问题如何解决的?
RabbitMQ消息的重复消费问题是在分布式系统中常见的一个挑战,解决该问题可以采取以下几种策略:
592 0
|
12月前
|
消息中间件 缓存 数据库
RabbitMQ消息的重复消费问题如何解决的 ?
在RabbitMQ中,重复消费是一个常见的问题,但可以通过以下几种方式来解决
1255 0