【RabbitMQ篇】消息堆积/丢失 解决办法

MQ消息队列消息堆积问题排查和解决思路 通过在Spring Boot项目中排查RabbitMQ消息堆积问题并采取相应措施,可以有效提升系统的性能和稳定性。主要的解决方案包括增加消费者数量、使用消息确认机制、配置死信队列、优化消费逻辑、合理配置队列参数等。 阅读详情

一、MQ消息堆积处理

1. 临时扩容,以更快的速度去消费数据

解决方案:
这种时候只能操作临时扩容,以更快的速度去消费数据了。具体操作步骤和思路如下:

  • ①先修复consumer的问题,确保其恢复消费速度,然后将现有consumer都停掉。

  • ②临时建立好原先10倍或者20倍的queue数量(新建一个topic,partition是原来的10倍)。

  • ③然后写一个临时分发消息的consumer程序,这个程序部署上去消费积压的消息,消费之后不做耗时处理,直接均匀轮询写入临时建好分10数量的queue里面。

  • ④紧接着征用10倍的机器来部署consumer,每一批consumer消费一个临时queue的消息。

  • ⑤这种做法相当于临时将queue资源和consumer资源扩大10倍,以正常速度的10倍来消费消息。

  • ⑥等快速消费完了之后,恢复原来的部署架构,重新用原来的consumer机器来消费消息。

2. 消息设置了过期时间,过期就丢了

假设你用的是rabbitmq,rabbitmq是可以设置过期时间的,就是TTL,如果消息在queue中积压超过一定的时间就会被rabbitmq给清理掉,这个数据就没了。那这就是第二个坑了。这就不是说数据会大量积压在mq里,而是大量的数据会直接搞丢。

解决方案:
这种情况下,实际上没有什么消息挤压,而是丢了大量的消息。所以第一种增加consumer肯定不适用。

这种情况可以采取 “批量重导” 的方案来进行解决。
在流量低峰期(比如夜深人静时),写一个程序,手动去查询丢失的那部分数据,然后将消息重新发送到mq里面,把丢失的数据重新补回来。

3. 积压消息长时间没有处理,MQ放不下了

解决方案:
这个就没有办法了,肯定是第一方案执行太慢,这种时候只好采用 “丢弃+批量重导” 的方式来解决了。

首先,临时写个程序,连接到mq里面消费数据,收到消息之后直接将其丢弃,快速消费掉积压的消息,降低MQ的压力,然后走第二种方案,在晚上夜深人静时去手动查询重导丢失的这部分数据。


二、MQ消息丢失处理

详细请看我的另外一篇文章:引入RabbitMQ后,你如何保证全链路数据100%不丢失?

1. 生产者弄丢了数据

  • 1.使用事务(性能差)
    可以选择用rabbitmq提供的事务功能,在生产者发送数据之前开启rabbitmq事务(channel.txSelect),然后发送消息,如果消息没有成功被rabbitmq接收到,那么生产者会收到异常报错,此时就可以回滚事务(channel.txRollback),然后重试发送消息;如果收到了消息,那么可以提交事务(channel.txCommit)。但是问题是,开始rabbitmq事务机制,基本上吞吐量会下来,因为太耗性能。

  • 2.发送回执确认(推荐)
    可以开启confirm模式,在生产者那里设置开启confirm模式之后,你每次写的消息都会分配一个唯一的id,然后如果写入了rabbitmq中,rabbitmq会给你回传一个ack消息,告诉你说这个消息ok了。如果rabbitmq没能处理这个消息,会回调你一个nack接口,告诉你这个消息接收失败,你可以重试。而且你可以结合这个机制自己在内存里维护每个消息id的状态,如果超过一定时间还没接收到这个消息的回调,那么你可以重发。

事务机制和cnofirm机制最大的不同在于**,事务机制是同步的**,你提交一个事务之后会阻塞在那儿,但是confirm机制是异步的,你发送个消息之后就可以发送下一个消息,然后那个消息rabbitmq接收了之后会异步回调你一个接口通知你这个消息接收到了。

2. RabbitMQ弄丢了数据-开启RabbitMQ的数据持久化

为了防止rabbitmq自己弄丢了数据,这个你必须开启rabbitmq的持久化,就是消息写入之后会持久化到磁盘,哪怕是rabbitmq自己挂了,恢复之后会自动读取之前存储的数据,一般数据不会丢。除非极其罕见的是,rabbitmq还没持久化,自己就挂了,可能导致少量数据会丢失的,但是这个概率较小。

设置持久化有两个步骤:

  • 第一个是创建queue的时候将其设置为持久化的,这样就可以保证rabbitmq持久化queue的元数据,但是不会持久化queue里的数据;
  • 第二个是发送消息的时候将消息的deliveryMode设置为2,就是将消息设置为持久化的,此时rabbitmq就会将消息持久化到磁盘上去。

必须要同时设置这两个持久化才行,rabbitmq哪怕是挂了,再次重启,也会从磁盘上重启恢复queue,恢复这个queue里的数据。

而且持久化可以跟生产者那边的confirm机制配合起来,只有消息被持久化到磁盘之后,才会通知生产者ack了,所以哪怕是在持久化到磁盘之前,rabbitmq挂了,数据丢了,生产者收不到ack,你也是可以自己重发的。

若生产者那边的confirm机制未开启的情况下,哪怕是你给rabbitmq开启了持久化机制,也有一种可能,就是这个消息写到了rabbitmq中,但是还没来得及持久化到磁盘上,结果不巧,此时rabbitmq挂了,就会导致内存里的一点点数据会丢失。

3. 消费端弄丢了数据

主要是因为你消费的时候,刚消费到,还没处理,结果进程挂了比如重启了,那么就尴尬了,RabbitMQ认为你都消费了,这数据就丢了。或者消费者拿到数据之后挂了,这时候需要MQ重新指派另一个消费者去执行任务(一块肉,刚用筷子夹起来,发地震抖了一下,肉掉了)

这个时候得**用RabbitMQ提供的ack机制,也是一种处理完成发送回执确认的机制。**如果MQ等待一段时间后你没有发送过来处理完成 那么RabbitMQ就认为你还没处理完,这个时候RabbitMQ会把这个消费分配给别的consumer去处理,消息是不会丢的。


三、mq消息重复发送的避免

最简单的解决方案是每条消费记录有个消费状态字段,根据这个消费状态字段来是否消费或者使用一个集中式的表,来存储所有消息的消费状态,从而避免重复消费

MQ的消息的重复消费和丢失问题如何解决?MQ的消息堆积问题如何解决?MQ的消息顺序性如何保证?MQ如何处理生产者和消费者的高并发情况? 总结起来,解决MQ消息的重复消费和丢失问题,需要保证消息的幂等性、使用消息确认机制、实现消息重试机制、保证消息的顺序性,并将消息进行持久化存储。可以在消息的header中添加重试次数的标记,当达到最大重试次数后,可以将消息发送到死信队列进行处理,以避免消息的无限重试。使用消息确认机制:在消费者消费消息完成后,及时向消息队列发送确认消息,告知消息队列该消息已经成功消费,从而可以删除该消息。MQ(消息队列)的消息堆积问题是指由于消费者处理速度跟不上生产者的消息产生速度,导致消息在消息队列中积压的情况。 阅读详情

相关推荐

RabbitMQ中如何解决消息堆积问题

对于无法立即处理或处理失败的消息,可以配置死信交换器和队列,当消息达到一定重试次数或者超过一定期限未被成功ACK时,消息将被转发到死信队列中,后续可以单独处理这部分消息,避免阻塞正常的消息流。当然,更重要的是理解业务需求和消息处理的规律,制定合理的架构和策略。: 对于不在活跃节点上的消息,可以启用惰性队列,这样在消费者请求消息时,消息才会从磁盘加载到内存中,一定程度上减轻内存压力。: 对于不同优先级的消息,可以配置优先级队列,确保高优先级的消息优先被处理,降低低优先级消息对系统造成的压力。

0 3797

RabbitMQ消息堆积问题

如何解决数百万消息堆积,无法及时消费的问题

一切总会归于平淡 9663

RabbitMQ消息堆积导致服务崩溃的急救手册:三步止血法+根治方案

凌晨3点,RabbitMQ队列飙到100万条,服务直接瘫痪!”——这是某电商平台技术负责人上周的真实经历。消息堆积引发的雪崩效应,轻则业务卡顿,重则数据丢失。今天这篇实战指南,手把手教你从。:你经历过最惨烈的消息堆积事故是什么?:关注博主并私信“MQ急救包”,免费领取《RabbitMQ高可用配置模板》+《清队列脚本合集》!消息堆积不是技术问题,而是资源管理问题。,让崩溃的MQ服务快速“起死回生”!止血只是权宜之计,根治需从。

m0_57948571的博客 1700

RabbitMQ--消息堆积--解决方案

本文介绍如何处理RabbitMQ消息堆积(积压)。

IT利刃出鞘的博客 2万+

RabbitMQ - 消息堆积问题的最佳解决方案?惰性队列

对于传统的队列来讲,如果没有开启消息持久化,所有接收到的消息都是放在内存里面的,目的就是为了加快消息投递的速度,这也是 RabbitMQ 的一个很优势——响应速度快.但是他也带来了一个问题,RabbitMQ 设置了一个内存预警值(内存存储的上限,默认是 40%),如果在消息堆积的情况下,很容易就到达这个预警值,此时,RabbitMQ 就会处于一个暂停状态,会阻止生产者投递消息进来,然后把内存中的一部分消息清理出来,刷出到磁盘中,这动作也叫 “page out”

CYK_byte的博客 4880

手把手教你解决Windows 10网络驱动器无法访问问题(附详细排查步骤)

本文详细指导Windows 10用户解决网络驱动器无法访问的常见问题。通过从现象快速定位到系统排查,提供了从检查网络连通性、修复凭据权限到调整高级设置的完整步骤,特别是针对“找不到网络路径”等错误,帮助用户高效恢复对共享资源的访问。

weixin_29233857的博客 517

【MQ】RabbitMQ 消息确认、堆积、丢失、重复消费等

AMQP AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受中间件不同产品、不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。 RabbitMQ 信道:信道是生产消费者与rabbit通信的渠道,生产者发布publish或是消费者订阅subscribe一个队列都是通过信道来通信的。信道是建立在TCP连接上的

keeper42的博客 7534

解锁微信小程序Camera组件的隐藏技能:连续扫码背后的逻辑与陷阱

本文深入解析微信小程序Camera组件在连续扫码功能中的技术原理与优化方案,涵盖识别率提升、内存管理策略及典型问题排查。通过实战参数对比和代码示例,帮助开发者解决扫码枪应用中的性能损耗与界面卡顿问题,提升零售、物流等场景的工作效率。

weixin_29019241的博客 492

如何解决RabbitMQ的消息堆积与消息丢失

目录 消息堆积 消息丢失 消息堆积 消息堆积的本质 当消息生产速度远远大于消息消费的速度,就会造成消息堆积。 消息堆积的后果 新消息无法进入队列、旧消息无法丢失、消息等待消费时间过长以至于超出了业务容忍范围。 消息堆积的原因 生产者突然大量发布消息、消费者消费失败、消费者出现性能瓶颈、消费者直接挂掉了 如何解决消息堆积 1.排查消费者的消费性能瓶颈 2.增加消费者的多线程处理 3.部署增加多个消费者 4.新增消息队列,可以想办法把消息按顺序的转移...

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

电源完整性仿真流程梳理

可根据仿真流程导图,一步一步的去设置完成仿真。仿真的关键,在于对电路回路的理解以及所放置的电压源与电流的合理性,对于去耦电容的选择,则需要根据谐振频率计算,从而选取有效滤波的容值。

csy17729158342的博客 3442

PyRoki:机器人运动学优化库入门教程

PyRoki:模块化机器人运动学优化工具包 本文介绍了PyRoki,一个模块化、可扩展且跨平台的机器人运动学优化工具包。PyRoki通过统一变量和成本函数接口,简化了逆运动学、轨迹优化和运动重定向等任务的实现,支持CPU、GPU和TPU加速。实验表明,PyRoki在批量逆运动学任务中比现有GPU加速库cuRobo快1.4-1.7倍,且收敛误差更低。其模块化设计支持快速集成新成本函数,并通过交互式可视化工具优化参数配置。PyRoki开源发布,为机器人运动优化提供了灵活高效的解决方案。

机器人控制与仿真应用 1291

【RabbitMQ】RabbitMQ 消息的堆积问题 —— 使用惰性队列解决消息的堆积问题

消息的堆积问题是指在消息队列系统中,当生产者以较快的速度发送消息,而消费者处理消息的速度较慢,导致消息在队列中积累并达到队列的存储上限。在这种情况下,最早被发送的消息可能会在队列中滞留较长时间,直到超过队列的容量上限。当队列已满且没有更多的可用空间来存储新消息时,新的消息可能无法进入队列,从而导致消息丢失。这种情况下的消息通常被称为死信,因为它们无法被正常消费。

qq_61635026的博客 5127

Mastercam软件二次开发:使用C#进行Mastercam二次开发

C#(发音为“C Sharp”)是一种现代、面向对象的编程语言,由微软开发,首次发布于2000年。它结合了C和C++的强大功能,同时引入了Java的垃圾回收机制,使得C#在开发效率和运行性能之间找到了一个良好的平衡点。C#的设计目标是提高开发者的生产力,它支持多种编程范式,包括面向对象、泛型、委托和事件等,这使得它成为开发Windows应用程序、Web应用程序、游戏(尤其是使用Unity引擎)和企业级应用的理想选择。

kkchenjj的博客 2214

RabbitMQ的消息堆积与丢失

RabbitMQ的消息堆积与丢失

陌上人如玉,公子世无双 731

三菱FX系列PLC模拟量输入AD模块的使用方法和相关编程设置详解

三菱FX系列PLC模拟量输入AD模块的使用方法和相关编程设置详解

Robot_PLC_HMI_Automation 1万+

YOLOv8改进策略【注意力机制篇】| CVPRW-2024 分层互补注意力混合层 H-RAMi 针对低质量图像的特征提取模块

许多证据表明层次化网络对图像恢复(IR)任务通常不太有效,因为IR的目标是逐个预测像素值(密集预测),而缩小特征图会丢失重要的像素级信息。然而,层次化结构有降低时间复杂度以及学习语义级和像素级特征表示的优点。为了弥补缺点并利用优点,设计了H - RAMi层。

Limiiiing的博客 378

RabbitMq如何保证消息的可靠性,消息的重复消费,消息堆积的问题

例如在开发中,商城订单和库存系统,当我们提交订单时,我们应该去锁定库存,但是由于网络原因,我们提交订单时没有反应,我们又提交了一次,此时减库存的操作执行2次,导致库存数量不对,这就是没有实现幂等。也就是根据业务逻辑来进行判断,我们收到消息然后更改订单状态,此时又收到一样的消息,因为我们查询订单状态为已经支付了,那么我们就不需要在修改状态了,这样就保证了同样的消息不会被消费。(1)我们可以增加消费者的数量,通过水平拓展,增加消费者的数量来提高消息处理能力(只要钱到位,都不是问题,如果没钱就用第四种,嘿嘿)。

Aa5107033的博客 1422

ADS1115 0-10V高精度ADC模块原理图设计,已量产

在水质监测、智能气象站、环境感知等领域,0-10V 电压输出的传感器占据了重要地位。这类传感器输出信号稳定、抗干扰能力强,但对数据采集模块的精度、线性度和易用性提出了严苛要求。本文将深度解析一款专为 0-10V 传感器设计的高精度 ADC 模块,从硬件架构、性能指标到工程化实践,全面呈现其设计思路与核心价值。

不脱发的程序猿 274

RabbitMQ消息队列(八):消息堆积、消息丢失、 有序消费消息、重复消费

当消息生产的速度长时间,远远大于消费的速度时。就会造成消息堆积。消息堆积的影响可能导致新消息无法进入队列可能导致旧消息无法丢失消息等待消费的时间过长,超出了业务容忍范围。产生堆积的情况生产者突然大量发布消息消费者消费失败消费者出现性能瓶颈。消费者挂掉解决办法排查消费者的消费性能瓶颈增加消费者的多线程处理部署增加多个消费者。...

fatestranger的博客 2543

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

RabbitMQ消息堆积处理

处理方式: 1.增加消费者的处理能力(例如优化代码),或减少发布频率 2.考虑使用队列最大长度限制. 3.给消息设置年龄,超时就丢弃 4.默认情况下,rabbitmq消费者为单线程串行消费,设置并发消费两个关键属性concurrentConsumers和prefetchCountoncurrentConsumers设置的是对每个listener在初始化的时候设置的并发消费者的个数,prefet...

喝醉的咕咕鸟 1万+

SAP B1中文培訓教材_SDK

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

RabbitMQ应用之消息堆积、消息丢失、有序消费、重复消费

文章目录前言一、消息堆积1. 消息堆积的产生与影响2. 消息堆积的解决方案二、消息丢失1. 情景2.解决方案三、有序消费1.情景2.解决方案四、重复消费1.情景2.解决方案 前言 最近接触了多线程和MQ等性能相关的内容,来写写MQ在实际开发中容易碰到的问题及其解决方法。这同时也是面试中常见的提问。 提示:以下是本篇文章正文内容,下面案例可供参考 一、消息堆积 1. 消息堆积的产生与影响 消息堆积的产生主要在于两方面,其一为消费的太慢或消费方出现异常,其二为生产方生产地太快。总的来说就是生产消费速度不匹

qq_45596525的博客 1860

RabbitMQ延时队列,消息重复、堆积、丢失、顺序

主要用来做异步、削峰、解耦 rabbitmq延时队列 可以设置队列延时,也可以设置消息延时 生产者->延时队列交换机->延时队列->死信队列->死信队列交换机->消费者 如果是不同梯度的延时并且梯度很少,例如 5s, 10s, 30s只有3个,可以设置不同的队列和交换机 中间的坑 重复消费 解决方法: 造成重复消费有可能是生产段发多了或者消费段方法没有做幂等导致超收了。 生产段:在发送前可以为每个消息设置一个唯一id作为幂等判断的条件,如果有重复的去重后

lh2420124680的博客 2153

RabbitMQ--消息丢失--原因/解决方案

本文介绍RabbitMQ消息丢失的原因以及解决方案(即:如何保证消息不丢失)。 消息在生产者、MQ服务器、消费者都可能丢失消息,本文分析这三处消息丢失的原因以及解决方案。 对于消息队列(MQ)来说,消息丢失/消息重复/消费顺序/消息堆积是比较常见的问题,都属于消息异常,这几个问题比较重要面试中也会经常问到。

IT利刃出鞘的博客 1万+

如何防止rabbitmq消息丢失

在我们使用mq的时候,我们发现了他的好处以及便捷性,但是mq中经常也会出现一些问题,比如mq的消息丢失、消息堆积、消息重复消费之类的问题,好在这些问题都有解决方法,而我们本节主要说的就是mq的消息丢失问题 首先我们要知道什么时候会丢失消息,在mq中总共有三个环节会丢失消息 一、生产者弄丢了数据 如果我们的生产者在中途传输过程出现问题导致了消息的丢失。这个时候我们应该怎么做,mq中提供了两种方式来防...

java线程池 3083

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

Rabbitmq面试题

Jay112011的博客 3355

RabbitMQ教程(四)| SpringBoot集成RabbitMq(消息丢失、消息重复、消息顺序、消息顺序)

SpringBoot集成RabbitMq(消息丢失、消息重复、消息顺序、消息顺序)

qq_20236937的博客 1894
上一篇: 【Spring依赖循环】提前曝光,直接曝光到二级缓存已经可以解决循环依赖问题了,为什么一定要三级缓存?
下一篇: 【HashMap篇】JDK1.7多线程下resize()导致最终产生循环链表的原因
_Romeo
_Romeo 优质创作者: 后端开发技术领域 优质创作者: 后端开发技术领域
博客等级 码龄8年 2万+粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Romeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值