Rocket-消息堆积与消息积压

概念

消息处理流程中,如果Consumer的消费速度跟不上Producer的发送速度,MQ中未处理的消息会越来越多,这部分消息就被称为堆积消息,消息出现堆积进而造成消息的消费延迟,一下场景需要重点关注消息堆积和消费延迟问题

  • 业务系统上下游能力不匹配造成的持续堆积,且无法自行恢复。
  • 业务系统对消息的消费实时性要求较高,即使是短暂的堆积造成的消息延迟也无法接受

产生原因分析

在这里插入图片描述
Consumer使用长轮询Pull模式消息时,分为下两个阶段:
拉取消息
Consumer通过长轮询Pull模式批量拉取的方式从服务端获取消息,将拉取到的消息存放到本地缓存队列中,对于拉取式消费,在内网环境下会有很高的吞吐量,所有这一阶段一般不会成为消息堆积的瓶颈。

消息消费
Consumer将本地缓存的消息提交到消费线程中,使用业务消费逻辑对消息进行处理,处理完毕后获取到一个结果,这是真正的消息消费过程,此时Consumer的消费能力就完全依赖于消息的消费耗时和消费并发度了,如果由于业务处理逻辑复杂等原因,导致处理单条消息的耗时较长,则整体的消息吞吐量肯定不会高,此时就会导致Consumer本地缓存队列达到上线,停止从服务端拉取消息。

结论
消息堆积的主要瓶颈在于客户端的消费能力,而消费能力由消费耗时,和消费并发决定,注意,消费耗时的优先级要高于消费并发度。即在保证了消费耗时的合理性前提下,再考虑消费并发度问题!

消费耗时

影响消息处理时长的代码逻辑,可能主要生产于两种类型的代码:CPU内部计算代码和外部I/O操作型代码。通常情况下代码中如果没有复杂的递归和循环的话,内部计算耗时相对I/O操作来说几乎可以忽略。所以外部IO型代码是影响消息处理处理时长的主要症结所在。

外部IO操作型代码举例:
读写外部数据库,例如对远程MySQL的访问
读写外部缓存系统,例如对远程Redis的访问

下游系统调用,例如Dubbo的RPC远程调用,SpringCloud的对下游系统的Http接口调用
关于下游系统调用逻辑要进行提前梳理,掌握每个调操作预期的耗时,这样做是为了能够判断消息逻辑中IO操作的耗时是否合理,通常消息堆积是由于小下游系统出现了服务异常或达到了DBMS容量限制,导致消费耗时增加。
网络异常,并不仅仅是系统中出现的类似500这样的代码错误,而可能是更加隐蔽的问题,例如网络带宽问题。达到了DBMS容量限制,其他会引发消息的消费耗时增加

消息并发读

一般情况下,消费者终端的消费并发度由单节点线程数和节点数量共同决定,其值为单节点线程数 * 节点数量,不过,通常需要优先调整单节点的线程数,若单机硬件资源达到了上限,则需要通过横向扩展来提高消费并发度。

单节点线程数:即单个Consumer所包含的线程数量
节点数量:即Consumer Group 所包含的Consumer数量
对于普通消息,延迟消息以及事务消息,并发度计算都是但几点线程数 * 节点数量,但对于顺序消息则是不同的,顺序消息的消费并发度等于 Topic的Queue分区数量。

单机线程数计算

对于一台主机中线程池中线程数的设置需要谨慎,不能盲目调用最大线程数,设置过大的线程数反而会带来大量的线程切换的开销,理想环境下单节点的最优线程计算模型为
C * (T1 + T2) / T1

  • C :CPU内核数
  • T1:CPU内部逻辑计算耗时
  • T2:外部IO操作耗时

如何避免

为了避免在业务中使用时出现费预期的消息堆积和消息言辞问题,需要在前期设计阶段对整个业务逻辑进行完善的排查和梳理,其中最重要的就是梳理消息的消费耗时和设置消息的并发度

梳理消息的消费耗时
通过压测获取消息的消费耗时,并对耗时较高的操作的代码逻辑进行分析,梳理消息的消费耗时需要关注以下信息:

  • 消息消费逻辑的计算复杂度是否过高,代码是否存在无限循环和递归等缺陷
  • 消息消费逻辑中的I/O操作是否是必须的,能否用本地缓存等方案规避
  • 消息逻辑中的复杂耗时的操作是否可以做异步化处理,如果可以,是否会造成逻辑错乱

设置消息并发度
对消息消费度的计算,可以通过一下两步实施

  • 逐步调大单个Consumer节点的线程数,并观测节点的系统指标,得到单个节点最优的消费线程和消费吞吐量
  • 更具上下游链路的流量峰值计算出需要设置的节点数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员劝退师-TAO

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

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

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

打赏作者

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

抵扣说明:

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

余额充值