消息重复消费的问题

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 消息重复消费的问题

公众号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}


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2天前
|
消息中间件 存储 NoSQL
解决MQ下单消息重复消费幂等机制详解
【11月更文挑战第20天】在分布式系统中,消息队列(Message Queue, MQ)作为一种常用的中间件,用于在不同系统或服务之间异步传输消息。MQ的应用场景广泛,如订单处理、日志收集、系统解耦等。然而,MQ的使用也伴随着一些挑战,其中消息重复消费是一个常见问题。特别是在下单场景中,如果消息被重复消费,可能会导致订单被重复创建或处理,从而引发一系列业务问题。
21 6
|
4月前
|
消息中间件 SQL RocketMQ
【RocketMQ系列五】消息示例-顺序消息&延迟消息&广播消息的实现
【RocketMQ系列五】消息示例-顺序消息&延迟消息&广播消息的实现
77 1
|
负载均衡 网络性能优化
EMQ如何保证消息不重复消费?
EMQ(Erlang MQTT Broker)通过以下机制来保证消息不重复消费
777 2
|
6月前
|
消息中间件 存储 Kafka
几种 MQ 顺序消息的实现方式
几种 MQ 顺序消息的实现方式
|
消息中间件 NoSQL Kafka
如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?
为了提高应用程序的性能和可扩展性,很多应用程序开始采用消息队列(MQ)来处理消息。 MQ 可以将消息异步地发送到目的地,从而实现解耦、异步处理和流量控制等功能。 但是,MQ 也带来了一些问题,如消息重复消费和消息消费的幂等性问题。 本文将介绍 MQ 如何保证消息不被重复消费,并讨论如何保证消息消费的幂等性。
|
消息中间件 存储 安全
RocketMQ-消息消费模式 顺序消费
RocketMQ-消息消费模式 顺序消费
216 0
|
消息中间件 Kafka 测试技术
MQ 学习日志(七) 保证消息消费的顺序性
保证消息消费的顺序性
179 0
|
消息中间件 监控 NoSQL
Rabbmit 重复消费的问题
最近遇到一个奇怪的问题,消费者在批量消费消息时,遇到该批次中出现部分重复消费导致业务异常。这些异常集中在某一时刻附近。
212 0
|
消息中间件 Kafka
Kafka消息的重复消费问题如何解决的 ?
Kafka 通过使用消费者组(Consumer Group)来解决消息的重复消费问题。
1619 0
|
消息中间件 存储 NoSQL
该如何保证消息不被重复消费
该如何保证消息不被重复消费
197 0