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,
那基本等于"盲飞"。

相关推荐
007php0074 小时前
PHP与Java项目在服务器上的对接准备与过程
java·服务器·开发语言·分布式·面试·职场和发展·php
Go高并发架构_王工12 小时前
Kafka性能调优:从参数配置到硬件选择的全方位指南
分布式·kafka·linq
小北方城市网15 小时前
Redis 分布式锁与缓存三大问题解决方案
spring boot·redis·分布式·后端·缓存·wpf·mybatis
小王努力学编程18 小时前
LangChain——AI应用开发框架
服务器·c++·人工智能·分布式·rpc·langchain·brpc
小北方城市网19 小时前
Spring Cloud 服务治理实战:构建高可用微服务体系
spring boot·python·rabbitmq·java-rabbitmq·数据库架构
一点事20 小时前
windows:zookeeper下载安装教程
windows·分布式·zookeeper
掘金-我是哪吒1 天前
Kafka本身只保证单个分区内的消息是有序的
分布式·kafka
2501_941982051 天前
Java 分布式环境下的 Access_Token 一致性方案:如何避免多节点冲突?
java·开发语言·分布式
菜宾1 天前
java-分布式面试题(事务+锁+消息队列+zookeeper+dubbo+nginx+es)
java·开发语言·分布式