RabbitMQ(四)重复消费/幂等性和有序性

RabbitMQ如何保证消息的顺序性【重点】 先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。进行两个数据库的数据同步,由于对数据库的数据操作是具有顺序性的,如果操作顺序搞反,就会造成不可估量的错误。,那么原本应该被删除的数据,就没有被删除,造成数据的不一致问题。操作,这个顺序必须是这样,如果在同步过程中,消息的顺序变成了。去消费,这样就会造成顺序的错误,... 阅读详情

幂等性

首先,rabbitMQ并没有为消息的重复消费而设计一种解决方法,这个解决方法需要我们来根据业务自己实现,我整理了几种常见的解决方法。

消息重复发送导致消息被重复消费的场景

  1. 在生产者发送消息给rabbitMQ服务器的时候,有可能因为网络波动等情况,导致生产者收不到rabbitMQ服务器的应答,导致生产者再发送一条消息。

  2. 也是因为网络波动等问题,导致rabbitMQ服务器在向消费者发送消息的时候,没有收到消费者的应答,重复向消费者发生消息。

这两个场景,其实最终都是导致消费者重复消费多次消息,所以在一般的场景下,我们只需要在消费者那里做消息重复消费的保障即可。

解决方法

思路

保证消息的唯一性,就算是多次传输,不要让消息的多次消费带来影响;保证消息等幂性;

  • 在消息生产时,MQ内部针对每条生产者发送的消息生成一个inner-msg-id,作为去重和幂等的依据(消息投递失败并重传),避免重复的消息进入队列;
  • 在消息消费时,要求消息体中必须要有一个bizId(对于同一业务全局唯一,如支付ID、订单ID、帖子ID等)作为去重和幂等的依据,避免同一条消息被重复消费。

这个问题针对业务场景来答分以下几点:

  1. 如果消息是做数据库的insert操作,给这个消息做一个唯一主键,那么就算出现重复消费的情况,就会导致主键冲突,避免数据库出现脏数据。

  2. 如果消息是做redis的set的操作,不用解决,因为无论set几次结果都是一样的,set操作本来就算幂等操作。

  3. 如果以上两种情况还不行,可以准备一个第三方介质,来做消费记录。以redis为例,给消息分配一个全局id,只要消费过该消息,将<id,message>以K-V形式写入redis。那消费者开始消费前,先去redis中查询有没消费记录即可。

有序性

如何保证消息的顺序性?

数据中台服务器A发送 创建学生信息 与 更新学生信息 两条消息。应用服务器B需要接受服务A的消息。接收到创建学生信息的消息就在表里创建一个学生记录。接受到更新学生的消息就更新学生基本信息。

如果B服务器部署了两台,服务A在很短的时间内发送了两条消息,那么服务B可能有一台做创建学生的操作,另外一台做更新学生的操作。那么就有可能发生,更新学生基本信息的操作早于创建学生基本信息的操作。这样的话更新就会失败。

这就牵扯到如何保证消息的顺序性

解决思路

在生产端发送消息的时候,把自己上一条消息ID 记录到放到消息体中。 在消费端接收到消息后,首先检查此消息中的 上一条消息ID属性。如果不存在上一条消息ID属性,那么就正常消费操作。如果成功消费,则将此次消费的消息ID记录到数据库中。  如果存在上一条消息ID属性,那么就先去数据库查看上一条消息是否已经成功被消费。 如果成功被消费,那么就执行正常的业务逻辑。消费并记录本次消息ID。  如果发现上一条消息没有被成功消费,那么可以稍等一下,在程序中执行睡眠X秒的操作。当休眠时间到了以后,再去检查一下上一条消息是否已经被成功消费。如果此时上一条消息仍然没有成功消费,那么就抛出异常,将当前的消息推回原队列,并等待下次重新消费。

在这里插入图片描述

rabbitMQ 消息顺序性、消息幂等性、消息不丢失、最终一致性、补偿机制、消息队列设计 消息顺序性、消息幂等性、消息不丢失、最终一致性、补偿机制、消息队列设计 阅读详情

相关推荐

RabbitMQ 如何避免消息重复消费?

RabbitMQ 如何避免消息重复消费?

吉衣の秋先生的博客 1万+

如何保证MQ的顺序性?比如Kafka

三、如何保证消息的顺序性 1. rabbitmq 拆分多个queue,每个queue一个consumer,就是多一些queue而已,确实是麻烦点;或者就一个queue但是对应一个consumer,然后这个consumer内部用内存队列做排队,然后分发给底层不同的worker来处理 2. kafka 写入一个partition中的数据一定是有序的,生产者在写的时候 ,可以指定一个k...

1175

RabbitMQ如何保证有序消费消息?如何防止消息被重复消费?

目录 有序消费消息 防止消息被重复消费 有序消费消息 造成消息乱序消费的原因有两种 情况一: 情况二 如何保证消息有序被消费 情况一: 情况二: 防止消息被重复消费 消息被重复消费的原因 造成消费被重复消费的原因来源于我们之前为了防止消息在消费者端丢失,采用的手动回复MQ的解决方案。如果消费者处理消息成功,手动向MQ回复消息时,网络不稳定,无法回复MQ消费完毕。此时MQ因为收不到消费者的回复而仍然把这条消息保存到MQ中,并...

我能在河边钓一整天的鱼 5023

RabbitMQ如何保证消息消费的顺序性?

什么场景下会发生消息的消费顺序的错乱?如何保证消息消费的有序性?

weixin_35794878的博客 1万+

Java实战-RabbitMQ重复消费如何解决

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

luosanjun1988120的博客 3747

施耐德EcoStruxure平台深度体验:IEC 61499在智慧物流中心的真实应用案例解析

本文深度解析施耐德EcoStruxure平台在智慧物流中心的应用,重点探讨IEC 61499标准如何通过分布式控制和功能块技术重构自动化逻辑。通过上海某物流中心的真实案例,展示了该平台在提升系统弹性、降低停机成本方面的显著成效,为工业自动化转型提供实践参考。

weixin_30576827的博客 66

基于SpringBoot+Redis实现RabbitMQ幂等性设计,解决MQ重复消费问题

配置死信交换机和死信队列,对于那些重复投递依然无法正确处理的消息,可以转移到死信队列,并设置相应的重试策略及最大重试次数,超过限制则记录日志、报警或手动介入处理。如果在执行消费的过程中,出错了(抛出Exception),则记录消费失败的状态,MQ会再次尝试去进行消费。这里是为了避免在消息开始消费后,RabbitMq宕机了,此时MQ并不知道这个消息最终有没有消费完成,因此重启MQ之后,MQ会重新消费这条消息。可以看到消费者服务,消费完第2个消息后,由于RabbitMQ宕机,本地服务报错,无法消费第3个消息。

jike11231的博客 2439

【MATLAB强化学习工具箱】学习笔记--在Simulink环境中训练智能体Create Simulink Environment and Train Agent

Simulink中便于搭建各类动力学与控制模型,通过将原有的控制器替换为AI控制器,可以方便使用已有模型,提供增量效果。 本节的重点是如何引入Simulink模型作为env,其他的内容在之前的文章中已有说明。 以水箱模型watertank为例,如下图所示: 采用PI控制器,控制效果如下所示: 将此PI控制器替换为神经网络控制器后,系统架构如下图所示: 具体替换策略如下所示: (1)删去PID控制器; (2)增加RL Agent模块; (3)观测器模块: 观测向量为:,其中...

bear_miao的博客 1万+

RabbitMQ如何防止消息丢失和重复消费

如图所示,RabbitMQ丢失消息的情况可以发生在上面任何一个节点。 1.1 生产者没有成功把消息发送到MQ a、丢失的原因:因为网络传输的不稳定性,当生产者在向MQ发送消息的过程中,MQ没有成功接收到消息,但是生产者却以为MQ成功接收到了消息,不会再次重复发送该消息,从而导致消息的丢失。 b、解决办法: 有两个解决办法:事务机制和confirm机制,最常用的是confirm机制。 事务机制: RabbitMQ 提供了事务功能,生产者发送数据之前开启 RabbitMQ 事务c...

shenxiaomo1688的博客 1万+

3分钟搞定!QQ音乐歌单导出Excel保姆级教程(含歌单ID获取技巧)

本文提供了一份详细的QQ音乐歌单导出Excel保姆级教程,帮助用户轻松备份和管理个人音乐收藏。教程核心在于获取歌单ID,并利用浏览器开发者工具执行脚本提取数据,最后通过Excel导入功能快速生成结构化表格。整个过程无需编程基础,3分钟即可搞定,是个人数据管理的实用技巧。

weixin_29008691的博客 1389

华硕ROG枪神双系统实战:Ubuntu安装避坑指南

本文是华硕ROG枪神笔记本安装Ubuntu双系统的详细避坑指南。针对其独特的硬件与BIOS设计,文章核心解决了VMD控制器导致硬盘无法识别、驱动兼容性等关键难题,并提供了从BIOS设置、分区方案到安装后驱动配置与性能调优的一站式解决方案,帮助用户实现稳定的双系统体验。

raspberrypi5的博客 545

RabbitMQ解决消息幂等性问题

前言 关于MQ消费者的幂等性问题,在于MQ的重试机制,因为网络原因或客户端延迟消费导致重复消费。使用MQ重试机制需要注意的事项以及如何解决消费者幂等性问题以下将逐一讲解。 1. RabbitMQ自动重试机制 消费者在消费消息的时候,如果消费者业务逻辑出现程序异常,这个时候我们如何处理? 使用重试机制,RabbitMQ默认开启重试机制。 实现原理: @RabbitHandler注解 底层使用A...

王小白来了 2万+

STM32L433使用DSP库配置过程

STM32L433中有FPU,在使用中为了使用其中的部分函数,需要对其进行配置。     配置成功后做些总结,留待后续复习备忘,同时也希望有朋友像我一样使用DSP库配置时少走弯路,留作交流。

在在在的博客 4549

RabbitMQ重复消费_rabbitmq重复消费问题

解决 RabbitMQ 重复消费问题是消息队列应用中非常重要的一部分。在实际应用中,可能会出现消费者因某种原因(例如网络问题、应用崩溃等)在处理消息时失败,然后重新开始处理相同的消息,导致消息的重复消费。为了解决这个问题,我们可以采用一些方法和策略来确保消息不会被重复消费。

2401_84182602的博客 5053

手把手教你学RDMA驱动开发专栏--第7章 队列对(QP)与数据传输实现​7.3 完成队列(CQ):事件通知机制与轮询/中断模式

本章详细探讨了RDMA驱动中完成队列(CQ)的事件通知机制,重点分析了轮询与中断两种模式的实现原理及优化策略。CQ作为操作结果的报告载体,其核心功能包括结果反馈、事件通知和资源同步。轮询模式通过主动查询实现低延迟,适合高性能场景;中断模式通过被动通知节省CPU资源,适用于低频事件处理。驱动实现需考虑CQ溢出防护、多QP共享同步等关键问题,并提供事件通道机制将CQE传递给用户态。通过对比两种模式的优缺点及适用场景,揭示了RDMA系统在性能与资源间的权衡机制。

MHD0815的博客 395

k8s篇之underlay网络和overlay区别

underlay和overlay

小橙子的笔记屋 2142

RabbitMQ重复消费

解决 RabbitMQ 重复消费问题是消息队列应用中非常重要的一部分。在实际应用中,可能会出现消费者因某种原因(例如网络问题、应用崩溃等)在处理消息时失败,然后重新开始处理相同的消息,导致消息的重复消费。为了解决这个问题,我们可以采用一些方法和策略来确保消息不会被重复消费。

海的那边,还是海吗 7414

科研必备:15款顶尖AI科研工具全面分析汇总(持续更新ing)

科研必备:15款AI科研工具全面分析汇总(持续更新ing)

Code_流苏:在代码中寻诗意,在实践中觅真知 9633

RabbitMQ--幂等性与重复消费

文章摘要: RabbitMQ中重复消费是常见问题,由消息重发机制导致。解决方案核心在于业务幂等性设计,关键措施包括:1)为消息添加唯一ID;2)消费端通过Redis或数据库实现去重。具体实现时,生产者需设置messageId,消费者通过判断ID是否已处理来控制幂等,成功处理后ACK,失败则NACK。SpringBoot中可通过MessageProperties和RabbitListener方便地实现这一机制。此外,还需结合死信队列、消息持久化等辅助措施确保系统可靠性。

你我约定有三的博客 715

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RabbitMQ解决消息幂等性问题--重复消费问题

SpringBoot消息重试机制 如果消费端 程序业务逻辑出现异常消息会消费成功吗? 不会成功,默认一直重试。 rabbitmq 默认情况下 如果消费者程序出现异常的情况下,会自动实现补偿机制(重试机制)是 队列服务器 发送补偿请求,不是生产者 充实实现原理: @RabbitListener 底层 使用Aop进行拦截,如果程序没有抛出异常,自动提交事务 如果Aop使用异常通知拦截 ...

紫蝶侠的博客 4300

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

RabbitMQ如何保证幂等性?

有个兄弟去年参加阿里面试的时候,就被问到了幂等性的问题。 幂等性是分布式系统设计中的一个重要概念,是在做系统或者接口设计时要着重考虑的问题,尤其像支付宝、银行、互联网金融等涉及钱的系统,既要高效,数据也要准确,绝对不能出现多扣款,多打款等问题,幂等性的设计就显得更为重要了。 本文我们就先来解释一下什么是幂等性?然后再看一下在MQ中怎么保证幂等性? 一、什么是幂等? 幂等性的实质是:对于一个...

Felix 6747

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

RabbitMQ如何保证消息不被重复消费(幂等性问题详解)

本篇用案例详细讲解RabbitMQ如何解决消息不重复消费问题,详细讲解了幂等性相关概念,欢迎沟通、打卡、交流!

末尾卡片和博主交流学习! 1万+

【RabbitMQ】如何保证消息消费时的幂等性+如何处理消息丢失的问题

一、如何保证消息消费时的幂等性 这个问题可以等价于如何保证消费不被重复消费?为什么在消费队列里消费到了重复的数据。 1、kafak消费端可能导致的重复消费问题 消费者准备提交offset,但还没有提交的时候,消费者进程被重启了。那么此时已经消费过的数据offset还没有提交。kafka也就不知道你消费了offset=153的那条数据。 消费者一旦重启,马上会找kafka说:哥们,把我上次消费到的那条数据之后的数据给...

柠檬树 3741

RabbitMQ中如何保证消息不被重复消费

简单业务:优先用 “唯一 ID + Redis 记录”,搭配消费逻辑幂等性(如 Redis 写操作、DB 唯一键 )。高并发场景:在 ID 去重基础上,用分布式锁兜底,或依赖 MQ 手动 ACK + 死信队列控制重试。极端严格场景:组合 “ID 去重 + 幂等逻辑 + 分布式锁”,确保重复消费绝对不影响业务结果。本质上,消息重复消费无法完全避免(网络、系统故障是常态 ),但通过让消费逻辑 “幂等” + 精准记录 / 校验消费状态,可彻底屏蔽重复消费的影响~

weixin_61718800的博客 1377

Rabbitmq消息的有序性、消息不丢失、不被重复消费

Rabbitmq面试题

Jay112011的博客 3355
上一篇: RabbitMQ(三)消费端ack机制
下一篇: java23种设计模式(一) -- 工厂方法模式(创建型设计模式)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值