文章目录
- [一、一句话理解 Ready 和 Unacked](#一、一句话理解 Ready 和 Unacked)
- 二、Ready:判断是否"发生积压"的核心指标
-
- [1. Ready 是什么?](#1. Ready 是什么?)
- [2. Ready 持续增长,意味着什么?](#2. Ready 持续增长,意味着什么?)
- [3. Ready 的健康状态判断](#3. Ready 的健康状态判断)
- 三、Unacked:反映消费者压力的指标
-
- [1. Unacked 是什么?](#1. Unacked 是什么?)
- [2. Unacked 很高,一定是问题吗?](#2. Unacked 很高,一定是问题吗?)
- [3. Unacked 的健康状态判断](#3. Unacked 的健康状态判断)
- [四、Ready + Unacked 组合判断](#四、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,
那基本等于"盲飞"。