原因分析
消息生产(Producer)远超预期
消息的生产的规模远超过原来的预期值,成数倍甚至几十倍的增长,这种产生的原因可能如下:
比如遇到各种流量冲击的活动:618、双11大促、竞拍、抢购、秒杀业务。(这种需要做好容量预估管理)
程序缺陷;死循环调用、批量请求、内存泄漏导致的流量飙升问题。
消息接收和持久化出现故障
Broker服务器接收消息并持久化出现问题:服务故障、网络延迟、持久化失败等,这种情况一般也比较少见...
消息消费(Consumer)能力下降致消息堆积
出现原因可能有如下几种:
消费失败时大量重试导致消息堆积。
消费者程序的故障:如 程序死锁,io阻塞等。
消费者资源瓶颈:目前的主流消息队列,单个节点消息收发的性能可以达到万级别甚至10万级+的水平。除非容量预估没有做好,一般不会出现这种问题。即使出现这种问题,通过Scale Out Broker 的实例数也是比较轻松可以解决的。
RocketMQ消息堆积的解决方法
增加消费者数量
消息堆积了,消费不过来了,可以通过增加消费者实例数量,让更多实例来消费消息,从而缓解堆积。
提升消费者消费速度
消费者消费速度慢可能是消息堆积的主要原因,可以通过以下方式提升消费速度:
引入线程池,提高消费的并发能力。
将消息本地存储后立即返回成功,后续再慢慢处理复杂逻辑。
降低生产者的生产速度
如果生产者是可控的,可以让生产者生成消息的速度慢一些,避免过量生产导致堆积。
清理过期消息
一些过期的消息或无法成功消费的消息,在业务评估后如果无影响或者影响较小,可以选择清理,减轻堆积压力。
调整 RocketMQ 的配置参数
调整消费模式、拉取间隔时间等 RocketMQ 参数,提高消费效率。例如缩短拉取间隔,或增大单次拉取的消息量。
增加 Topic 队列数
如果一个 Topic 的队列数量过少,可能导致并发能力不足,从而出现堆积。增加队列数可以提高消息的处理并发度,有效缓解消息堆积。