一、
Overview
Connections
Channels
Exchanges
Queues and Streams
Admin
这些菜单分别对应RabbitMQ的整体状态、客户端连接、消息通道、交换机、队列以及系统管理等功能
Rabbitmq中一条完整的消息传递流程通常如下
生产者
↓
Connection
↓
Channel
↓
Exchange
↓
Binding
↓
Queue
↓
Channel
↓
消费者
二、
这部分是 RabbitMQ Management(管理控制台)Overview 首页中的 Nodes(节点信息) 区域。
它主要用于监控 RabbitMQ 节点的运行状态,包括节点名称、文件描述符、Erlang 进程数、内存使用情况、磁盘空间、运行时间以及 CPU 核心数等。
对于 RabbitMQ 运维来说,这部分非常重要,可以帮助我们快速判断 RabbitMQ 服务是否正常运行,以及是否存在内存、磁盘或系统资源方面的风险。
Name(节点名称)
rabbit@0e52a0973d3f
表示当前节点的名称。
用@分隔符
0e52a0973d3f:表示当前主机的主机名
rabbit:RabbitMQ 节点名称
rabbit@hostname
如果部署集群,每个节点都需要有唯一的节点名称
File desciptors(文件描述符)
文件描述符(File Descriptor,简称 FD)是操作系统用于标识打开文件、网络连接等资源的整数。
在 RabbitMQ 中,文件描述符主要用于:
- 客户端 TCP 连接。
- 节点之间的网络通信。
- 文件读写操作。
- 日志及其他系统资源访问。
44表示当前使用的文件描述符数量
1073741816 available 表示剩余可用数量(受操作系统限制、进程限制)
文件描述数量过低可能导致RabbitMQ无法正常建立新的网络连接
Erlang processes(Erlang进程)
RabbitMQ 底层使用 Erlang/OTP 运行,而 Erlang 使用轻量级进程(Process)实现并发处理。
这些进程与操作系统中的 Windows/Linux 进程不是同一个概念。
RabbitMQ 内部会通过大量 Erlang 进程处理不同的任务,例如:
- 消息接收与发送。
- 队列消息处理。
- 网络连接管理。
- 消费者消息分发。
- 集群节点通信。
- 内部定时任务。
559 表示当前Erlang进程数量
10498576 avaliable 当前距离Erlang进程数量上限的可用额度
如果Erlang进程数量接近上线,可能导致RabbitMQ无法创建新的内部进程,影响消息梳理及服务稳定性
Memory(内存)
用于监控RabbitMQ当前的内存使用情况
247 MiB 表示当前RabbitMQ节点的内存使用量
4.7GIB high watemark 内存高水位阈值 当达到阈值时,会触发内存保护机制,暂停或者限制消息发布,避免内存耗尽。
Disk space(磁盘空间)
用于监控RabbitMQ所在节点的磁盘空间
54 GIB 当前可用磁盘空间
48 MIB low watermark 磁盘空间低水位阈值
RabbitMQ不仅会在内存中处理消息,也可能将消息持久化到磁盘
当磁盘剩余空间低于低水位阈值时,会发出磁盘警告,触发后会限制消息发布,防止磁盘空间耗尽。
Uptime(运行时间)
表示当前RabbitMQ节点已经连续运行了多少时间
这个指标可以帮助判断最近是否发生过重启
例如:
- 运行时间持续增长:节点持续运行。
- 运行时间突然归零:可能发生了服务重启。
- 频繁归零:需要排查服务异常、系统重启或容器重启等问题。
Cores (CPU核心数)
表示当前RabbitMQ节点检测到的CPU核心数量
Info(界定信息)
这里展示的是节点相关的附加信息和状态标记。
其中 rss 是 RabbitMQ 节点的相关状态标记,basic、2 等属于管理页面展示的节点信息标识,不是内存、CPU 或磁盘使用量。
这一列不属于日常资源监控的核心指标,实际排查问题时应重点关注前面的资源数据。
Reset stats(重置统计数据)
this node 重置当前节点的统计数据
all nodes 重置集群中手头节点的统计数据
这俩按钮主要用于监控统计数据的重置
三、Connections
RabbitMQ Management(管理控制台)中的 Connections(连接) 页面
Connections 是 RabbitMQ 中非常重要的一个监控模块,主要用于查看客户端与 RabbitMQ Broker 之间的网络连接情况。
例如,在实际开发中:
- Java 服务通过 Spring AMQP 连接 RabbitMQ。
- .NET 服务通过 RabbitMQ.Client 连接 RabbitMQ。
- 多个业务系统同时连接 RabbitMQ。
- 消费者通过连接从 RabbitMQ 获取消息。
- 生产者通过连接向 RabbitMQ 发布消息。
这些客户端与 RabbitMQ 建立的连接,都可以在 Connections 页面中查看。
Connections 连接概述
RabbitMQ 中的 Connection(连接)表示客户端与 RabbitMQ Broker 之间建立的 TCP 网络连接。
客户端通过 Connection 与 RabbitMQ 通信,完成消息发布、消息消费、队列声明、交换机声明等操作。
需要区分两个概念:
- Connection:客户端与 RabbitMQ 之间的 TCP 连接。
- Channel:建立在 Connection 之上的逻辑通信通道。
一个 Connection 可以创建多个 Channel。
Java 应用程序
|
| TCP Connection
|
RabbitMQ Broker
|
±— Channel 1
|
±— Channel 2
|
±— Channel 3
实际开发中,通常不会为每一次消息发送都重新建立 TCP 连接,而是复用 Connection,通过多个 Channel 完成不同业务操作。
State(连接状态)
| 状态 | 含义 |
|---|---|
| running | 连接正常运行 |
| closing | 连接正在关闭 |
| blocked | 连接被阻塞,通常与资源告警或流量控制有关 |
SSL / TLS(安全连接)
○ 表示当前连接没有启用 SSL/TLS。
SSL/TLS 用于对客户端与 RabbitMQ 之间的网络通信进行加密。
AMQP 5672 普通 TCP 通信
AMQPS 5671 TLS 加密通信
生产环境中,如果 RabbitMQ 需要通过公网或不可信网络进行通信,建议配置 TLS,保护消息传输安全。
Protocol(通信协议)
表示当前客户端使用 AMQP 0-9-1 协议与 RabbitMQ 通信。
AMQP(Advanced Message Queuing Protocol)是一种消息队列通信协议。
RabbitMQ 默认支持 AMQP 0-9-1 协议,也是 Java Spring AMQP、RabbitMQ.Client 等客户端常用的协议。
可以简单理解为
客户端
|
| AMQP 0-9-1
|
RabbitMQ
客户端和 RabbitMQ 需要使用兼容的通信协议,才能正常进行消息交互。
Channels(通道数量)
表示当前 Connection 上创建了 1 个 Channel。
Channel 是建立在 TCP Connection 之上的逻辑通信通道。
为什么需要 Channel?
因为创建 TCP 连接需要一定的系统资源和网络开销。如果每次执行消息操作都创建新的 TCP 连接,效率会比较低。
因此 RabbitMQ 采用 Connection + Channel 的方式:
- Connection 负责底层 TCP 网络连接。
- Channel 负责具体的 AMQP 操作。
- 一个 Connection 可以创建多个 Channel。
实际开发中,通常使用 Connection 复用和 Channel 管理机制,提高通信效率。
From client(客户端流量)
表示客户端向 RabbitMQ 发送的数据速率。
表示当前统计周期内,客户端平均每秒向 RabbitMQ 发送约 18 字节的数据。
客户端发送的数据可能包括:
- 消息发布数据。
- AMQP 协议帧。
- 心跳及其他协议通信数据。
因此,这个指标并不完全等于业务消息的数据量。
To client(服务端流量)
表示 RabbitMQ 向客户端发送的数据速率。
常见场景:
- RabbitMQ 向消费者推送消息。
- 返回消息确认结果。
- 返回队列或交换机声明结果。
- 发送心跳及其他协议数据。
From client 和 To client 可以帮助我们分析客户端与 RabbitMQ 之间的数据通信情况。
| 指标 | 方向 | 含义 |
|---|---|---|
| From client | 客户端 → RabbitMQ | 客户端发送的数据 |
| To client | RabbitMQ → 客户端 | RabbitMQ 发送的数据 |
四、Channels
Channel(通道)是建立在 Connection(TCP 连接)之上的逻辑通信通道。
RabbitMQ 客户端建立 TCP 连接后,可以在这个连接上创建多个 Channel,通过不同的 Channel 执行消息发布、消费、队列声明、交换机声明等操作。
一个 Connection 可以创建多个 Channel。
使用 Channel 的好处是:可以复用底层 TCP 连接,减少频繁创建网络连接带来的资源开销。
主要分为三个区域:
- Overview:通道基本信息。
- Details:通道详细信息。
- Message rates:消息速率统计。
State(通道状态)
running Channel 正在执行相关操作
idle Channel 当前处于空闲状态
idle 并不代表 Channel 已关闭或者出现故障,只是表示当前没有活跃的操作需要执行。
Unconfirmed(未确认发布消息)
表示当前 Channel 上没有等待 Broker 确认的消息发布请求。
这里涉及 RabbitMQ 的 Publisher Confirms(生产者发布确认)机制。
生产者发送消息时,可以开启发布确认机制,让 RabbitMQ 在接收并处理发布请求后向生产者返回确认结果。
Producer
|
| 发布消息
v
RabbitMQ
|
| 处理消息
v
返回 Publisher Confirm
|
v
Producer 收到确认
如果消息已经发布,但生产者还没有收到 Broker 的确认,那么这条消息就属于未确认发布消息。
Unconfirmed 与 Unacked 是两个不同的概念。
- Unconfirmed:生产者发布消息后,等待 Broker 确认。
- Unacked:消费者接收消息后,尚未向 Broker 确认。
Prefetch(预取数量)
Prefetch 是 RabbitMQ 消费者消息预取机制中的重要参数。
它用于控制消费者在尚未确认消息的情况下,可以预先获取多少条消息。
Unacked(未确认消息)
Unacked 是 RabbitMQ 消费者消息确认机制中的一个重要指标。
它表示:
消息已经被 RabbitMQ 投递给消费者,但是消费者还没有向 RabbitMQ 返回确认结果。
五、Exchanges
Exchange(交换机)是 RabbitMQ 消息路由机制中的核心组件,主要负责接收生产者发送的消息,并根据交换机类型、Routing Key(路由键)以及 Binding(绑定关系),将消息路由到一个或多个队列。
Producer(生产者)
|
| 发送消息
v
Exchange(交换机)
|
| 根据路由规则分发
v
Queue(队列)
|
| 消费消息
v
Consumer(消费者)
Exchange 本身不负责存储消息,它主要负责消息的接收和路由。 消息最终进入队列,由队列负责存储和等待消费者处理。
Virtual host(虚拟主机)
表示交换机所属的虚拟主机。
/ 默认虚拟主机
/dev 开发环境
/test 测试环境
/prod 生产环境
通过不同的 Virtual Host,可以对不同业务环境或业务系统进行逻辑隔离。
Type(交换机类型)
Direct Exchange(直连交换机)
根据 Routing Key 精确匹配队列的 Binding Key。
例如
Routing Key: order.create
Queue A: order.create -> 匹配
Queue B: order.update -> 不匹配
Fanout Exchange(广播交换机)
将消息广播到所有绑定的队列,不考虑 Routing Key。
例如:一个系统通知消息,同时发送给多个业务队列。
Topic Exchange(主题交换机)
根据 Routing Key 和 Binding Key 的模式进行匹配。
例如
Routing Key: waterlogging.event.warning
Binding Key: waterlogging.event.*
*:匹配一个单词。
#:匹配零个或多个单词。
Headers Exchange(头部交换机)
- 根据消息 Header 属性进行路由,而不是根据 Routing Key。
常见匹配模式:- x-match = all:所有指定条件都满足。
- x-match = any:任意一个指定条件满足。
| 类型 | 路由依据 | 主要用途 |
|---|---|---|
| Direct | Routing Key 精确匹配 | 指定业务路由 |
| Fanout | 不考虑 Routing Key | 消息广播 |
| Topic | Routing Key 模式匹配 | 多业务分类路由 |
| Headers | 消息 Header | 按消息属性路由 |
实际开发建议:
- 明确指定业务目标:优先考虑 Direct。
- 多个业务模块都需要收到消息:考虑 Fanout。
- 需要按照业务类型、事件类型进行分类:考虑 Topic。
- 需要根据消息属性组合路由:考虑 Headers。
Features(交换机特性)
Durable(持久化)
交换机设置为持久化后,RabbitMQ 重启时仍会保留该交换机定义。
需要注意:交换机持久化不代表消息持久化。消息是否能够在重启后保留,还需要考虑队列类型、消息持久化属性等因素。
六、Queues and Streams
Queue(队列)是 RabbitMQ 中用于存储消息的重要组件。
生产者通常不会直接把消息发送到队列,而是将消息发送到 Exchange,由 Exchange 根据绑定关系和路由规则,将消息投递到对应 Queue。
七、创建Virtual Host
Virtual Host 是什么?
Virtual Host 是 RabbitMQ 提供的一种逻辑隔离机制。
可以把它理解为 RabbitMQ 内部的一个独立消息管理空间。
不同 Virtual Host 之间的交换机、队列和绑定关系相互隔离。
每个 Virtual Host 都可以拥有自己独立的:
- Exchanges(交换机)
- Queues(队列)
- Bindings(绑定关系)
- Permissions(用户权限)