【消息中间件】如何解决RocketMQ消息堆积的问题

一、背景

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

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

二、MQ消息堆积

MQ消息堆积是指生产者发送的消息短时间内在Broker端大量堆积,无法被消费者及时消费,从而导致业务功能无法正常使用。

三、消息堆积常见于以下几种情况:

  1. 新上线的消费者功能有bug,消息无法被消费
  2. 消费者实例宕机或者因为网络问题暂时无法与Broker建立连接。
  3. 生产者短时间内大量推送消息到Broker,消费者消费能力不足。
  4. 生产者未感知到Broker消费堆积,持续向Broker推送消息。

四、解决上述问题需要做到

  1. 解决问题一,要做好灰度发布,每次新功能上线前,选取一定比例的消费实例做灰度(灰度测试,就是在某项产品或者应用发布前,选择特定人群使用,逐步扩大其使用者的数量,以便于及时发现和纠正其中的问题),若出现问题,及时回滚;若消费者消费正常,平稳运行一段时间后,再升级其他实例。
  2. 解决问题二,要做到多活,极端情况下,当一个IDC(互联网数据中心?)内消费实例全部宕机后,需要做到让其他IDC内的消费实例正常消费消息。同时,若一个IDC内Broker全部宕机,需要支持生产者将消息发送到其他idc中的Broker。
  3. 解决问题三,要增强消费能力,主要是增加消费者线程数或者增加消费者实例的个数,增加消费者线程数要注意消费者及其下游服务的消费能力,上线前要将线程池参数调到最优状态。增加消费者实例个数,要注意Queue的数量,消费实例的数量要与Queue数量相同,如果消费实例数量超过Queue的数量,多出的消费实例分不到Queue,只增加消费实例是没有用的,如果消费实例数量比Queue数量少,每个消费实例承载的流量都是不同的。
  4. 解决问题四,要做到熔断与隔离,当一个Broker的队列出现消息积压时,要对其熔断,将其隔离,将新消息发送发送至其他队列,过一定的时间,再解除其隔离。

五、如何解决消息堆积和延迟问题

想要快速避免消息堆积和延迟给业务带来的影响,您可以通过消息队列RocketMQ版提供的监控报警功能,设置告警规则提前预警消息堆积问题,或通过业务埋点,触发报警事件,及时监控到消息堆积问题并进行处理。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u011397981/article/details/130532920