07 | 消息积压了该如何处理?

RocketMQ消息积压问题及解决方案 分布式系统中,消息中间件扮演着至关重要的角色,它如同系统的中枢神经,负责在各个服务之间高效、可靠地传递信息。然而,随着系统规模扩大和业务量激增,消息积压问题逐渐成为许多系统的梦魇。消息积压如同隐形杀手,严重影响着系统的健康,轻则导致系统响应迟缓,重则引发服务雪崩,最终造成业务损失。 阅读详情

消息积压的直接原因是系统中,某个部分存在性能问题,来不及处理上游消息。

优化性能来避免消息积压

消息队列本身的处理能力要远大于业务系统的处理能力。主流产品的单节点,消息收发性能在每秒几万到几十万条,还可以通过水平拓展broker实例数量成倍提升。

由于业务代码逻辑远比消息队列复杂,单节点可以达到 百/千 QPS 已经算性能很好了。

因此对于优化性能,关注点在消息收发两端,业务代码如何与消息队列配合去达到最优性能。

1. 发送端性能优化

优先检查发送消息前,业务逻辑代码的耗时。

其次对于发送消息的代码,设置合适的并发,批量大小,可以达到很好的发送性能。

一次发送消息包含:producer端序列化消息,构造请求等逻辑;producer发送请求和broker返回确认响应的网络延时;broker端处理消息耗时;

至于选择提高并发,还是批量大小,取决于发送端的业务性质。即怎么方便怎么来。

以发送端为微服务为例,由于RPC框架都支持多线程处理请求,因此直接在请求中发送消息即可实现并行发送消息。在线业务对时延敏感,批量发送则会影响时延不合适使用。

以发送端为离线分析系统为例,离线系统在性能上不关心时延,更关注整个系统的吞吐。发送端的数据都来自于数据库,这种情况就更适合批量发送,可以批量从数据库读取数据,然后批量地发出消息,同样也可以用少量并发获得非常搞的吞吐量。

2. 消费端性能优化

大部分使用消息队列的性能问题会出现在消费端,若消费的速度跟不上生产消息的速度,就会造成积压。

若倒挂情况暂时,则可以在消费端性能追上之后,慢慢消化掉积压的消息。

若一直是倒挂情况,时间长了,要么消息队列存储被占满,无法提供服务,要么就发生丢消息,对于整个系统来说都是严重故障。

因此设计系统的时候,一定要保证消费速度远高于生产速度,系统才能健康运行。

消费端性能优化方式如下:

1. 优化消费业务逻辑

2. 水平扩容,增加消费端的并发数(增加topic中的queue数量,consumer数量与queue[分区]一一对应),实际上是增加主题中的分区数量(请求-确认)。

很多消费程序会通过下图来解决消费满

OnMessage ——put——> 内存队列   ——take——> 业务线程

                                                            ——take——> 业务线程

                                                            ——take——> 业务线程

消息的业务逻辑可能不能再优化了(仍比较慢),为了避免积压,收到消息的OnMessage方法中,不处理任何业务逻辑,把这个消息放到内存队列就离开了。而内存队列可以启动多业务线程增加并发处理速度。

但注意这种方案遇到节点宕机,内存队列中没来得及处理的内容就会丢失。

消息积压了如何处理

固定的线上积压排查方法:

消息积压粗粒度原因分类

1. 发送变快了

2. 消费变慢了

通过大部分消息队列内置的监控功能,确认是上述哪个情况:

1. 如果是单位时间的发送消息变多,如赶上大促或抢购、短时间无法优化代码,可通过立刻水平扩容消费端的实例数来提升消费性能。

如果短时间没有足够服务器资源进行扩容,没办法的办法是对系统进行降级,关闭不重要的业务,减少发送方发送消息的数量,最低限度让系统能正常运转,服务重要业务。

2. 另一种不太常见的情况是,无论发消息和接受消息的速度都没什么变化。此时需要检查消费端是否一直消费失败,导致一条消息重复消费,这种情况会拖慢整个系统的消费速度。

3. 如果消费速度变慢了,需要检查消费实例,分析速度变慢原因,看下日志中是否有大量错误,没有的话,通过打印堆栈信息(golang 中的 pprof)看下消费代码是不是出现了死锁或者卡在了资源等待上。

小结

这节课主要讨论了2个问题,一个是如何在消息队列的接收两方优化性能,提前预防消息积压。另一个问题是,当系统发生消息积压后,该如何处理。

优化消息发性能,可以通过减少前置业务逻辑耗时,或者常用的两种是增加批量或者增加并发,在发送端两种都可以使用。在消费端需注意增加并发需要同步扩容分区数量不然不起作用。

对于系统发生消息积压的情况,需要先解决积压,再分析问题,保证系统可用性是首要解决的问题。快速解决积压的方法时通过水平扩容增加consumer的实例数量。

思考题

消费端是否也可以同样通过批量消费来提升消费性能?什么样的场景下适合使用这种方法?或者这种方法有什么局限性?

1. 消费端对消息的处理支持批量处理,或者开启多线程单处理。

2. 批量消费中一旦一条数据消费失败会导致整批消息重复消费。

3. 对实时性要求不能太高,批量消费需要broker积累到一定消费数据才会发送到consumer。

RocketMQ如何保证消息不丢失? 如何快速处理积压消息 文章目录1. 哪些环节会有丢消息的可能? 1. 哪些环节会有丢消息的可能?         关于MQ,有一个问题是无法避免的,就是怎么保证消息不丢失,这个问题是所有MQ都需要面对的一个共性问题。大致的解决思路都是一致的,首先要找到哪些环节会有丢消息的可能,来看一个MQ的通用架构         其中,1,2,4三个场景分别是:发消息消息主从同步 阅读详情

相关推荐

消息队列消息积压解决办法

1.1 概述 其实本质针对的场景,就是说可能你的消费端出了问题,不消费了;或者消费的速度极其慢。接着就坑爹了,就可能出现以下三大问题场景: 1、可能你的消息队列集群的磁盘都快写满了,都没人消费,这个时候怎么办? 2、或者是这整个就积压了几个小时,你这个时候怎么办? 3、或者是你积压的时间太长了,导致比如 RabbitMQ 设置了消息过期时间后就没了怎么办? 所以就这事儿,其实线上挺常见的,一出就是大问题。一般常见于,举个例子,消费端每次消费之后要写 mysql,结果 mysql 挂了,消费端停在那儿了,不动

ᶻᶻᶻ 枕星河的博客 8428

消息积压怎么处理

消息积压该怎么处理 1. 出现原因 系统的某个部分出现了性能问题,来不及处理上游发送的消息,才会导致消息积压 2. 优化性能避免消息积压 消息队列的性能优化,更关注,在消息的收发两端,我们的业务代码怎么和消息队列配合,达到一个最佳的性能。 2.1 发送端性能优化 代码发送消息的性能上不去,你需要优先检查一下,是不是发消息之前的业务逻辑好事太久导致的 只需要注意设置合适的并发和批量大小,就可以达到很好的发送性能 2.2 消费端性能优化 设计系统的时候,一定要保证消费端的消费性能要高于生产端的发送性能,这

xl10010542的博客 501

【基础篇-消息队列】——如何处理消息积压问题

摘要: 本文探讨消息队列消息积压问题的优化与处理方案。积压主要源于消费性能不足或生产过快。优化性能需关注生产与消费两端:生产端可通过批量发送或并发提升吞吐量,消费端需确保消费能力高于生产速度,并同步扩容消费者实例与分区数。处理突发积压时,优先通过监控定位问题(生产加速或消费变慢),快速扩容消费者实例或降级非核心业务。关键点在于预防为主,发生时紧急扩容优先恢复系统可用性。避免使用内存队列等易丢失消息的临时方案。

小志的博客 1497

消息持续积压几小时怎么办

大量消息在mq里积压了几个小时了还没解决   几千万条数据在MQ里积压了七八个小时,最简单的方法可以让他恢复消费速度,然后等待几个小时消费完毕。   一个消费者一秒是1000条,一秒3个消费者是3000条,一分钟是18万条,1000多万条 ,所以如果你积压了几百万到上千万的数据,即使消费者恢复了,也需要大概1小时的时间才能恢复过来   一般这个时候,只能操作临时紧急...

weixin_30535843的博客 742

消息积压问题的理解和解决办法

总之,消息积压问题是一个普遍存在的问题,需要采取一些措施来优化系统,并且需要坚持持续监测和优化。通过合理的消息管理和优化,可以提高系统的性能和可靠性,确保系统的正常运行。

chen_xiayu的博客 1524

系统学习消息队列分享(八) 消息积压了该如何处理?

据我了解,在使用消息队列遇到的问题中,消息积压这个问题,应该是最常遇到的问题了,并且,这个问题 还不太好解决。 我们都知道,消息积压的直接原因,一定是系统中的某个部分出现了性能问题,来不及处理上游发送的消 息,才会导致消息积压。 所以,我们先来分析下,在使用消息队列时,如何来优化代码的性能,避免出现消息积压。然后再来看看, 如果你的线上系统出现了消息积压,该如何进行紧...

weixin_30586085的博客 747

消息队列_07(消息积压该怎么处理)

消息积压该怎么处理 1. 出现原因 系统的某个部分出现了性能问题,来不及处理上游发送的消息,才会导致消息积压 2. 优化性能避免消息积压 消息队列的性能优化,更关注,在消息的收发两端,我们的业务代码怎么和消息队列配合,达到一个最佳的性能。 2.1 发送端性能优化 代码发送消息的性能上不去,你需要优先检查一下,是不是发消息之前的业务逻辑好事太久导致的 只需要注意设置合适的并发和批量大小,就可以达到很...

qq_21486655的博客 907

RabbitMQ应用问题 - 消息顺序性保证、消息积压问题

a)消息顺序性:消费者消费的消息的顺序 和 生产者发送消息的顺序是一致的.例如 生产者 发送消息顺序是 msg1、msg2、msg3,那么消费者也需要按照 msg1、msg2、msg3 的顺序进行消费.b)顺序不一致可能会导致哪些问题?消息1:修改 用户318 的昵称为 “白天”.消息2:修改 用户318 的昵称为 “黑夜”.那么,按正常的逻辑来讲,用户318 的名称最后因该为 “黑夜”,但如果 消息1 是最后一个被消费者消费的消息,那么 用户318 的名称就变成了 “白天”.

CYK_byte的博客 3108

RabbitMQ消息积压

RabbitMQ消息积压是指消息的生产速度大于消费速度,导致消息在队列中堆积的现象。这种情况在高并发、高流量的业务场景中尤为常见。

weixin_42069404的博客 1685

紧急生产问题:线上kafka百万消息积压如何处理

大家在日常开发中,是否处理过大批量消息积压的问题呢?它一般由于代码bug(比如消费逻辑处理有误)、或者生产者的生产速度大于消费者的消费速度(如大促、抢购等活动期间导致消息数量激增,或者消费者处理速度极慢),就可能导致生产环境出现百万、甚至千万的消息积压。那么,假设发生kafka百万消息堆积,如何解决呢?先排查是不是bug,如果是,要快速修复优化消费者代码逻辑临时紧急扩容,新建临时topic对于线上kafka 消息大量积压的问题,我总结了这几点:我们要做好监控和告警,

没有伞的孩子必须努力奔跑!—小林 531

07 几百万消息消息队列积压了几个小时如何解决?

目录   1、面试题 2、面试官心里分析 3、面试题分析 (1)大量消息在mq里积压了几个小时了还没解决 (2)这里我们假设再来第二个坑 (3)然后我们再来假设第三个坑 1、面试题 如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决? 2、面试官心里分析 你看这问法,其实本质针对的场景,都是说,可能你的消费端出了问题,...

hanjungua8144的博客 3105

科普文:软件架构设计之【消息队列中的关键问题:消息丢失、顺序消费、消息积压与重复消费】

分布式系统中,消息队列扮演着至关重要的角色,它解耦了系统组件,提高了系统的可扩展性和可靠性。然而,在使用消息队列时,我们经常会遇到一些问题,如消息丢失、顺序消费、消息积压和重复消费。本文将深入探讨这些问题的原因,并提供相应的解决方案。

为无为,事无事,味无味。 1431

消息队列消息队列常见面试题总结

消息消费完毕后,消费者会发送一个ACK确认消息消息队列消息队列就知道该消息被消费了,就会将该消息消息队列中删除,但如果消费者发送的消息因为网络传输等问题,没有发送给消息队列消息队列无法确认消息是否被消费,就会继续将消息交给其他消费者。因为生成者在写入的时候会指定一个key,而通常我们会用订单号来做这个key,当消费者进行消费时,发现同一个key的多条消息,就会使用多线程处理,来提高速度,由于最终处理速度不同,执行binlog的顺序错乱。(可达到微秒级),单机的吞吐量可达到万级,基本不会丢失消息

别倒在黎明之前的博客 479

消息队列消息积压如何处理

在使用消息队列遇到的问题中,消息积压这个问题,应该是最常遇到的问题了,并且,这个问题 还不太好解决。 我们都知道,消息积压的直接原因,一定是系统中的某个部分出现了性能问题,来不及处理上游发送的消 息,才会导致消息积压。...

大道至简,持之以恒! 3784

消息中间件】详解mq消息积压

详解mq消息积压的表现、原因、解决办法。

BugMan的博客 3382
上一篇: 06 | 如何处理消费过程中的重复消息
下一篇: 09 | 学习开源代码该如何入手?
vectorX
博客等级 码龄10年 37粉丝 21原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值