RabbitMQ怎么排查由于大量消息堆积在内存中拖慢集群整体性能

落婷同学_1259

落婷同学_1259

2026-11-05

675人浏览

原创

根本原因是Unacked消息长期未确认导致内存占用,而非单纯消息量大;Unacked>50且稳定在100+即表明消费者阻塞或未正确ACK,需检查消费者状态、关闭闲置管理插件并验证惰性队列配置。

rabbitmq怎么排查由于大量消息堆积在内存中拖慢集群整体性能

内存被消息占满导致集群变慢,根本不是“消息太多”的问题,而是消息没及时落地、又没被消费确认,全卡在内存里——RabbitMQ 默认把 Ready 状态的消息全放内存,Unacked 的消息也还挂在消费者连接上,两者叠加就容易爆内存。

看懂 messages_ready 和 messages_unacknowledged 真实含义

这两个数字不是“队列里有多少消息”,而是“Broker 当前要管多少消息”:

  • messages_ready:已入队但还没发给任何消费者的数量。默认全驻内存,不设惰性队列(x-queue-mode=lazy)时,它涨 10 万条,内存就多吃几百 MB
  • messages_unacknowledged:已发给消费者、但还没收到 ack 的数量。如果消费者卡死、崩溃或没设超时,这些消息就一直挂着,既不重发也不释放,连接资源和内存双占用
  • 重点:只要 messages_unacknowledged 长期 > 50(尤其稳定在 100+),基本可断定是消费者端任务阻塞或未正确 ack,不是 Broker 性能问题

关掉 rabbitmq_management 插件再查内存

RabbitMQ 内存飙升常被误判为“消息堆积”,实际是管理插件在后台高频拉取 stats 数据,每秒几十次 HTTP 请求 + JSON 序列化,CPU 和内存开销远超消息本身:

  • 运行 rabbitmq-plugins disable rabbitmq_management 立刻生效,不用重启
  • 观察 erlang memory 指标(用 rabbitmq-diagnostics memory_breakdown)是否快速回落
  • 若回落明显,说明之前压根不是消息问题,而是监控反噬——Web 控制台开着不用时,务必关插件

检查惰性队列(x-queue-mode=lazy)是否真正启用

惰性队列不是“开了就省内存”,必须满足三个条件才生效:

RabbitMQ 4.2.3
RabbitMQ 4.2.3

RabbitMQ 4.2.3 是 2026 年初发布的重要稳定更新版本,重点修复了 Khepri 元数据存储相关问题,并改进了监控性能。对于使用 Docker、Kubernetes 或微服务架构的开发团队来说,该版本兼容性和稳定性表现较好。

下载
  • 队列声明时显式设置 x-queue-mode=lazy(仅声明有效,运行中修改无效)
  • 队列不能是镜像队列(x-ha-policy 与 lazy 不兼容)
  • 消息必须处于 ready 状态才会写磁盘;一旦被投递成 unacked,仍留在内存——所以光开 lazy 不解决 unacked 卡住的问题
  • 验证方式:查 rabbitmqctl list_queues name queue_mode,确认目标队列显示 lazy 而非 default

用 rabbitmqctl list_connections 找“假在线真僵死”的消费者

大量 unacked 消息背后,常是消费者进程僵死但 TCP 连接没断,RabbitMQ 还以为它活着,继续往里塞消息:

  • 运行 rabbitmqctl list_connections columns=name,recv_oct,send_oct,channels,state
  • 重点关注 recv_oct(接收字节数)长期不动、state 是 running 但 channels 数异常高的连接
  • 这类连接大概率对应一个卡住的 Celery worker 或 Java Spring AMQP 客户端,需直接 kill 进程并检查日志里的超时/死锁
  • 别依赖心跳:AMQP 心跳只保连接不断,不保业务逻辑不卡

真正拖垮集群的,往往不是消息量,而是那些没人管的 unacked 消息和开着不用的管理插件——它们让 RabbitMQ 在替你背锅。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

664

5

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

2026.01.28

1108

20

RabbitMQ使用教程合集
RabbitMQ使用教程合集

RabbitMQ使用教程合集整理 RabbitMQ 基础教程、消息队列开发案例、生产者消费者、交换机与队列实战内容。

2026.05.20

224

15

RabbitMQ集群部署指南
RabbitMQ集群部署指南

RabbitMQ集群部署指南聚合 RabbitMQ 集群部署、高可用架构、镜像队列、故障恢复、监控与运维优化内容。

2026.05.20

137

12

RabbitMQ Docker实战指南
RabbitMQ Docker实战指南

RabbitMQ Docker实战指南提供 RabbitMQ Docker 镜像部署、Docker Compose、Kubernetes Operator 与云原生实践教程。

2026.05.20

162

10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

6587

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2728

6

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

2026.11.03

0

18

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

2026.11.03

0

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 入门教程
RabbitMQ 入门教程

共0课时 | 144人学习

RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

RabbitMQ 官方文档
RabbitMQ 官方文档

共0课时 | 0人学习