RabbitMQ 中 Ready 和 Unacked 到底是什么意思?如何用它们判断系统是否健康

文章目录

在使用 RabbitMQ 的过程中,很多人都会在管理控制台看到两个指标:

  • Ready
  • Unacked

它们看起来很简单,但真正理解并用好这两个指标,是判断 RabbitMQ 是否健康、是否存在性能瓶颈的关键


一、一句话理解 Ready 和 Unacked

在 RabbitMQ 中,队列里的消息大致会经历三个阶段:

复制代码
生产 → 进入队列 → 投递给消费者 → 被 ack

对应到指标上:

指标 含义
Ready 已经在队列中,但还没投递给消费者的消息
Unacked 已经投递给消费者,但**还没被确认(ack)**的消息

Ready 看的是:消费速度是否跟得上生产速度
Unacked 看的是:消费者是否处理得过来


二、Ready:判断是否"发生积压"的核心指标

1. Ready 是什么?

Ready 表示当前队列中"等待被消费"的消息数量

这些消息已经:

  • 被 Producer 成功发送
  • 被 RabbitMQ 接收并放入队列
  • 但还没有被分发给任何 Consumer

2. Ready 持续增长,意味着什么?

最常见的情况是:

复制代码
生产速度 > 消费速度

此时你会看到:

  • Ready 数量不断增加
  • 队列开始出现积压

这通常说明:

  • 消费者数量不足
  • 单个消费者处理太慢
  • 或系统已经接近极限

3. Ready 的健康状态判断

Ready 状态 含义
接近 0,轻微波动 系统健康
缓慢上升 接近瓶颈
持续快速上升 已超出消费能力

👉 在压测时,Ready 是最重要的观察指标,没有之一。


三、Unacked:反映消费者压力的指标

1. Unacked 是什么?

Unacked 表示已经投递给消费者,但消费者还没有返回 ack 的消息数量

出现 Unacked,通常说明:

  • 使用的是手动 ack
  • 或者使用了批量 ack
  • 消费者正在处理消息

2. Unacked 很高,一定是问题吗?

不一定。

Unacked 高,常见有两种原因:

情况一:消费者处理慢(问题)

  • 业务逻辑耗时
  • IO 阻塞(数据库、HTTP)
  • CPU 已打满

这种情况下,Unacked 会持续增长


情况二:prefetch 设置过大(非问题)

RabbitMQ 会根据 prefetch 参数,一次性向消费者推送多条消息。

例如:

复制代码
prefetch = 1000

消费者瞬间拿到 1000 条消息,此时:

  • Unacked 很高
  • 但会稳定在一个区间内

👉 这不一定是瓶颈,而是配置行为。


3. Unacked 的健康状态判断

Unacked 状态 含义
稳定在一个固定区间 正常
持续增长 消费者处理不过来
大幅抖动 消费逻辑不稳定

四、Ready + Unacked 组合判断

单独看 Ready 或 Unacked 都不够,真正有价值的是"组合判断"

Ready Unacked 系统状态
0 系统健康
消费者数量不足
0 消费慢 / prefetch 偏大
系统已超载
0 0 无生产或无消费

这是在压测和生产环境中,快速判断系统状态的黄金法则


五、压测中的真实案例说明

场景一:Ready 持续增长,Unacked 很小

说明:

  • 消费者很快 ack
  • 但数量不够

👉 解决方案:增加消费者数量


场景二:Unacked 很大,Ready 为 0

说明:

  • RabbitMQ 已经把消息都推给了消费者
  • 消费者正在处理

👉 重点检查 prefetch 是否过大


场景三:Ready 和 Unacked 一起增长

这是最危险的情况:

  • 队列开始堆积
  • 消费者也处理不过来

👉 说明已经超过系统能力上限


六、经验建议

对于手动 ack 的普通业务场景

text 复制代码
prefetch ≈ 消费线程数 × 2 ~ 5

例如:

  • 消费线程数 = 10
  • prefetch = 20 ~ 50

这样可以避免 Unacked 过高,同时保证吞吐。


七、总结

  • Ready 反映的是:消息是否在队列中堆积
  • Unacked 反映的是:消费者是否有处理压力
  • 两者结合,才能准确判断 RabbitMQ 是否健康

如果你在压测或生产环境中,只看 TPS、不看 Ready / Unacked,
那基本等于"盲飞"。

相关推荐
初次攀爬者1 小时前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者2 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧3 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖3 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农3 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者3 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端
业精于勤_荒于稀3 天前
物流订单系统99.99%可用性全链路容灾体系落地操作手册
分布式
Ronin3053 天前
信道管理模块和异步线程模块
开发语言·c++·rabbitmq·异步线程·信道管理
Asher05093 天前
Hadoop核心技术与实战指南
大数据·hadoop·分布式
凉凉的知识库3 天前
Go中的零值与空值,你搞懂了么?
分布式·面试·go