RabbitMQ 管理
一、插件管理
RabbitMQ 提供了很多的插件,默认存放在 $RABBITMQ_HOME/plugins 目录下。
1. rabbitmq-plugins 语法
1 | rabbitmq-plugins [-n node] { command } [ command options...] |
2. 启动插件
1 | rabbitmq-plugins enable [plugin-name] |
3. 关闭插件
1 | rabbitmq-plugins disable [plugin-name] |
4. 查看当前插件的使用情况
1 | rabbitmq-plugins list |
标记为 [E*] 的为显式启动,而 [e*] 为隐式启动,如显式启动 rabbitmq_management 插件会同时隐式启动 amqp_client、cowboy、cowlib、rabbitmq_management_agent、rabbitmq_web_dispatch 等另外 5 个插件。
5. web 端管理插件 - rabbitmq_management
RabbitMQ management 插件同样是由 Erlang 语言编写的,并且和 RabbitMQ 服务运行在同一个 Erlang 虚拟机中。
RabbitMQ management 插件可以提供 Web 管理界面用来管理虚拟主机、用户等,也可以用来管理队列、交换器、绑定关系、策略、参数等,还可以用来监控 RabbitMQ 服务的状态及一些数据统计类信息,可谓是功能强大,基本上能够涵盖所有 RabbitMQ 管理的功能。
开启 rabbitmq_management 插件之后还需要重启 RabbitMQ 服务才能使其正式生效。之后就可以通过浏览器访问 web 管理后台:http://localhost:15672。
6. RabbitMQ 命令行管理工具 - rabbitmqctl
rabbitmqctl 工具是用来管理 RabbitMQ 中间件的命令行工具,它通过连接各个 RabbitMQ 节点来执行所有操作。
rabbitmqctl 工具的标准语法如下:
1 | rabbitmqctl [-n node] [-t timeout] [-q] { command } [ command options...] |
命令选项解析:
-n:节点名称。
-q:启用 quiet 模式,这样可以屏蔽一些消息的输出。默认不开启 quiet 模式。
-t:操作超时时间(秒为单位),只适用于“list_xxx”类型的命令,默认是无穷大。
二、多租户
每一个 RabbitMQ 服务器都能创建虚拟的消息服务器,我们称之为虚拟主机(virtual host),简称为 vhost。
每一个 vhost 本质上是一个独立的小型 RabbitMQ 服务器,拥有自己独立的队列、交换器及绑定关系等,并且它拥有自己独立的权限。vhost 就像是虚拟机与物理服务器一样,它们在各个实例间提供逻辑上的分离,为不同程序安全保密地运行数据,它既能将同一个 RabbitMQ 中的众多客户区分开,又可以避免队列和交换器等命名冲突。
vhost 是 AMQP 概念的基础,客户端在连接的时候必须制定一个 vhost。RabbitMQ 默认创建的vhost为“/”。
1. 创建 vhost
1 | rabbitmqctl add_vhost {vhost} |
2. 删除 vhost
1 | rabbitmqctl delete_vhost {vhost} |
删除一个 vhost 同时也会删除其下所有的队列、交换器、绑定关系、用户权限、参数和策略等信息。
3. 查询当前 vhost 的相关信息
rabbitmqctl list_vhosts [vhostinfoitem...] |
vhostinfoitem 的取值有 2 个:
name:表示 vhost 的名称。
tracing:表示是否使用了 RabbitMQ 的 trace 功能。

注:
若要删除所有的交换器、队列及绑定关系,删除对应的 vhost 就可以“一键搞定”,而不需要一个个遍历删除。
三、用户、角色与权限
1. 用户管理
在 RabbitMQ 中,用户是访问控制(Access Control)的基本单元,且单个用户可以跨越多个 vhost 进行授权。针对一至多个 vhost,用户可以被赋予不同级别的访问权限,并使用标准的用户名和密码来认证用户。
(1)创建用户
1 | rabbitmqctl add_user {username} {password} |
(2)删除用户
1 | rabbitmqctl delete_user {username} |
(3)查看用户列表
1 | rabbitmqctl list_users |
(4)修改密码
1 | rabbitmqctl change_password {username} {newpassword} |
(5)清除密码
1 | rabbitmqctl clear_password {username} |
(6)通过密码验证用户
1 | rabbitmqctl authenticate_user {username} {password} |
2. 角色管理
用户的角色分为 5 种类型:
(1)none:无任何角色。新创建的用户的角色默认为 none。
(2)management:可以访问 Web 管理页面。
(3)policymaker:包含 management 的所有权限,并且可以管理策略(Policy)和参数(Parameter)。
(4)monitoring:包含 management 的所有权限,并且可以看到所有连接、信道及节点相关的信息。
(5)administartor:包含 monitoring 的所有权限,并且可以管理用户、虚拟主机、权限、策略、参数等。administator 代表了最高的权限。
设置用户角色:
1 | rabbitmqctl set_user_tags {username} {tag...} |
设置之后任何之前所有的身份都会被删除。
3. 权限管理
AMQP 协议中并没有指定权限在 vhost 级别还是在服务器级别实现,由具体的应用自定义。在RabbitMQ 中,权限控制则是以 vhost 为单位的。当创建一个用户时,用户通常会被指派给至少一个 vhost,并且只能访问被指派的 vhost 内的队列、交换器和绑定关系等。因此,RabbitMQ 中的授予权限是指在 vhost 级别对用户而言的权限授予。
(1)授予权限
1 | rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} { read } |
其中各个参数的含义如下所述。
vhost:授予用户访问权限的 vhost 名称,可以设置为默认值,即 vhost 为“/”。
user:可以访问指定 vhost 的用户名。
conf:一个用于匹配用户在哪些资源上拥有可配置权限的正则表达式。
write:一个用于匹配用户在哪些资源上拥有可写权限的正则表达式。
read:一个用于匹配用户在哪些资源上拥有可读权限的正则表达式。
注:可配置指的是队列和交换器的创建及删除之类的操作;可写指的是发布消息;可读指与消息有关的操作,包括读取消息及清空整个队列等。
示例:
授予 root 用户可访问虚拟主机 /,并在所有资源上都具备可配置、可写及可读的权限:
1 | rabbitmqctl set_permissions -p / root ".*" ".*" ".*" |
授予 root 用户可访问虚拟主机 wjt-host,在以“queue”开头的资源上具备可配置权限,并在所有资源上拥有可写、可读的权限:
1 | rabbitmqctl set_permissions -p wjt-host root "^queue.*" ".*" ".*" |
(2)清除权限
1 | rabbitmqctl clear_permissions [-p vhost] {username} |
清除权限也是在 vhost 级别对用户而言的。
(3)查询权限信息
显示虚拟主机上的权限:
1 | rabbitmqctl list_permissions [-p vhost] |
显示用户的权限:
1 | rabbitmqctl list_user_permissions {username} |
四、应用管理
1. pid_file
RabbitMQ 的 pid_file 是通过调用 rabbitmq-server 命令启动 RabbitMQ 服务时创建的,默认情况下存放于 Mnesia(安装目录下的 var/lib/rabbitmq/mnesia/ 子目录) 目录中,可以通过 RABBITMQ_PID_FILE 这个环境变量来改变存放路径。注意,如果使用 rabbitmq-server-detach 这个带有 -detach 后缀的命令来启动 RabbitMQ 服务则不会生成 pid_file 文件。

2. 停止运行 RabbitMQ 的 Erlang 虚拟机和 RabbitMQ 服务应用
(1)
1 | rabbitmqctl stop [pid_file] |
如果指定了 pid_file,还需要等待指定进程的结束。
(2)
1 | rabbitmqctl shutdown |
执行这个命令会阻塞直到 Erlang 虚拟机进程退出。如果 RabbitMQ 没有成功关闭,则会返回一个非零值。这个命令和 rabbitmqctl stop 不同的是,它不需要指定 pid_file 就可以阻塞等待指定进程的关闭。
3. 停止 RabbitMQ 服务应用
1 | rabbitmqctl stop_app |
停止 RabbitMQ 服务应用,但是 Erlang 虚拟机还是处于运行状态。此命令的执行优先于其他管理操作(这些管理操作需要先停止 RabbitMQ 应用),比如 rabbitmqctl reset。
4. 启动 RabbitMQ 应用
(1)
1 | rabbitmqctl start_app |
启动 RabbitMQ 应用。此命令典型的用途是在执行了其他管理操作之后,重新启动之前停止的 RabbitMQ 应用,比如 rabbitmqctl reset。
(2)
1 | rabbitmqctl wait [pid_file] |
等待 RabbitMQ 应用的启动。它会等到 pid_file 的创建,然后等待 pid_file 中所代表的进程启动。当指定的进程没有启动 RabbitMQ 应用而关闭时将会返回失败。
5. 将 RabbitMQ 节点重置还原到最初状态
(1)
1 | rabbitmqctl reset |
将 RabbitMQ 节点重置还原到最初状态。包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据,如已配置的用户、vhost 等,以及删除所有的持久化消息。执行 rabbitmqctl reset 命令前必须停止 RabbitMQ 应用(比如先执行 rabbitmqctl stop_app)。
(2)
1 | rabbitmqctl force_reset |
强制将 RabbitMQ 节点重置还原到最初状态。不同于 rabbitmqctl reset 命令,rabbitmqctl force_reset 命令不论当前管理数据库的状态和集群配置是什么,都会无条件地重置节点。它只能在数据库或集群配置已损坏的情况下使用。与 rabbitmqctl reset 命令一样,执行 rabbitmqctl force_reset 命令前必须先停止 RabbitMQ 应用。
6. 指示 RabbitMQ 节点轮换日志文件
1 | rabbitmqctl rotate_logs {suffix} |
指示 RabbitMQ 节点轮换日志文件。RabbitMQ 节点会将原来的日志文件中的内容追加到“原始名称+后缀”的日志文件中,然后再将新的日志内容记录到新创建的日志中(与原日志文件同名)。当目标文件不存在时,会重新创建。如果不指定后缀 suffix,则日志文件只是重新打开而不会进行轮换。
五、集群管理
1. 将节点加入指定集群中
rabbitmqctl join_cluster {cluster_node} [-- ram ] |
在这个命令执行前需要停止 RabbitMQ 应用并重置节点。
2. 显示集群的状态
1 | rabbitmqctl cluster_status |
3. 修改集群节点的类型
1 | rabbitmqctl change_cluster_node_type {disc| ram } |
在这个命令执行前需要停止 RabbitMQ 应用。
4. 将节点从集群中删除
1 | rabbitmqctl forget_cluster_node [--offline] |
允许离线执行。
5. 更新集群信息
1 | rabbitmqctl update_cluster_nodes {clusternode} |
在集群中的节点应用启动前咨询 clusternode 节点的最新信息,并更新相应的集群信息。这个和 join_cluster 不同,它不加入集群。
6. 强制启动节点
1 | rabbitmqctl force_boot |
确保节点可以启动,即使它不是最后一个关闭的节点。通常情况下,当关闭整个 RabbitMQ 集群时,重启的第一个节点应该是最后关闭的节点,因为它可以看到其他节点所看不到的事情。但是有时会有一些异常情况出现,比如整个集群都掉电而所有节点都认为它不是最后一个关闭的。在这种情况下,可以调用 rabbitmqctl force_boot 命令,这就告诉节点可以无条件地启动节点。在此节点关闭后,集群的任何变化,它都会丢失。如果最后一个关闭的节点永久丢失了,那么需要优先使用 rabbitmqctl forget_cluster_node --offline 命令,因为它可以确保镜像队列的正常运转。
7. 镜像队列同步操作
(1)同步镜像
1 | rabbitmqctl sync_queue [-p vhost] {queue} |
指示未同步队列 queue 的 slave 镜像可以同步 master 镜像的内容。同步期间此队列会被阻塞(所有此队列的生产消费者都会被阻塞),直到同步完成。此条命令执行成功的前提是队列 queue 配置了镜像。注意,未同步队列中的消息被耗尽后,最终也会变成同步,此命令主要用于未耗尽的队列。
(2)取消同步
1 | rabbitmqctl cancel_sync_queue [-p vhost] {queue} |
取消队列 queue 同步镜像的操作。
8. 设置集群名称
1 | rabbitmqctl set_cluster_name {name} |
集群名称在客户端连接时会通报给客户端。Federation 和 Shovel 插件也会有用到集群名称的地方。集群名称默认是集群中第一个节点的名称,通过这个命令可以重新设置。
六、服务端状态
1. 查询队列详细信息
1 | rabbitmqctl list_queues [-p vhost] [queueinfoitem...] |
如果无 [-p vhost] 参数,将显示默认的 vhost 为“/”中的队列详情。queueinfoitem 参数用于指示哪些队列的信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。如果没有指定 queueinfoitems,那么此命令将显示队列的名称和消息的个数。
示例:

参数解析:
name:队列名称。
durable:队列是否持久化。
messages_ready:准备发送给客户端的消息个数。
messages_unacknowledged:发送给客户端但尚未应答的消息个数。
messages_ram:驻留在内存中的消息总数。
messages_persistent:队列中持久化消息的个数。
memory:与队列相关的 Erlang 进程所消耗的内存字节数,包括栈、堆及内部结构。
state:队列状态。
此外,还有更多参数支持。
2. 查询交换器详细信息
1 | rabbitmqctl list_exchanges [-p vhost] [exchangeinfoitem...] |
如果无 [-p vhost] 参数,将显示默认的 vhost 为“/”中的交换器详情。exchangeinfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。如果没有指定 exchangeinfoitem,那么此命令将显示交换器的名称和类型。
示例:

参数解析:
name:交换器的名称。
type:交换器的类型。
durable:设置是否持久化。
arguments:其他一些结构化参数,比如 alternate-exchange。
policy:应用到交换器上的策略名称。
此外,还有更多参数支持。
3. 查询绑定关系细节
1 | rabbitmqctl list_bindings [-p vhost] [bindinginfoitem...] |
如果无 [-p vhost ]参数,将显示默认的 vhost 为“/”中的绑定关系详情。bindinginfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。如果没有指定bindinginfoitem,那么将显示所有的条目。

参数解析:
source_name:绑定中消息来源的名称。
source_kind:绑定中消息来源的类别。
destination_name:绑定中消息目的地的名称。
destination_kind:绑定中消息目的地的种类。
routing_key:绑定的路由键。
arguments:绑定的参数。
4. 查询TCP/IP连接统计信息
1 | rabbitmqctl list_connections [connectioninfoitem...] |
connectioninfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。如果没有指定 connectioninfoitem,那么会显示 user、peer_host、peer_port 和 state 这几项信息。
示例:

参数解析:
name:连接的名称。
vhost:与连接相关的 vhost 的名称。
user:与连接相关的用户名。
peer_host:返回反向 DNS 获取的对端主机名称。
peer_port:服务器对端端口。
ssl:是否启用 SSL。
protocol:使用的 AMQP 协议的版本。
channels:该连接中的信道个数。
state:连接状态。
此外,还有更多参数支持。
5. 查询当前所有信道的信息
1 | rabbitmqctl list_channels [channelinfoitem...] |
channelinfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。如果没有指定 channelinfoitem,那么会显示 pid、user、consumer_count 和 messages_unacknowledged 这几项信息。

参数解析:
name:信道的名称。
vhost:与信道相关的 vhost。
user:与信道相关的用户名称。
consumer_count:信道中的消费者的个数。
transactional:信道是否处于事务模式。
confirm:信道是否处于 publisher confirm 模式。
此外,还有更多参数支持。
6. 查询消费者信息
1 | rabbitmqctl list_consumers [-p vhost] |
每行将显示由制表符分隔的已订阅队列的名称、相关信道的进程标识、consumerTag、是否需要消费端确认、prefetch_count 及参数列表这些信息。

7. Broker 状态
1 | rabbitmqctl status |
比如当前 Erlang 节点上运行的应用程序、RabbitMQ/Erlang 的版本信息、OS 的名称、内存及文件描述符等统计信息。
8. 健康检查
1 | rabbitmqctl node_health_check |
对 RabbitMQ 节点进行健康检查,确认应用是否正常运行、list_queues 和 list_channels 是否能够正常返回等。
9. 显示每个运行程序环境中每个变量的名称和值
1 | rabbitmqctl environment |
10. 服务器状态报告
1 | rabbitmqctl report |
为所有服务器状态生成一个服务器状态报告,并将输出重定向到一个文件。(其中包含了mnesia 目录与配置、日志文件目录、连接、信道、环境变量等各种参数值)
11. 执行任意 Erlang 表达式
1 | rabbitmqctl eval { expr } |
七、HTTP API 接口管理
RabbitMQ Management 插件不仅提供了 Web 管理界面,还提供了 HTTP API 接口来方便调用。比如创建一个队列,就可以通过PUT方法调用 /api/queues/vhost/name 接口来实现。
所有的 HTTP API 接口都需要 HTTP 基础认证(使用标准的 RabbitMQ 用户数据库),默认的是 guest/guest(非 localhost 的不能使用这组认证,除非特殊设置)。
HTTP API 接口通常用来方便客户端的调用。如果单纯地使用 curl 的方式来调用,rabbitmqadmin 会显得更加方便。rabbitmqadmin 也是RabbitMQ Management 插件提供的功能,它会包装 HTTP API 接口,使其调用显得更加简洁方便。
rabbitmqadmin 是需要安装的,不过这个步骤非常简单,可以点击 Web 管理页面左下角的“Command Line”跳转到“rabbitmqadmin”页面进行下载。在使用 rabbitmqadmin 前还要确保已经成功安装 Python,Python 的版本需为 2.x。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2019-10-08 go递归遍历文件目录