RabbitMQ CLI 管理工具 rabbitmqadmin(管理和监控)
插个广告,公司最近在招“.NET”开发(杭州),如果你现在还从事 .NET 开发(想用 .NET Core,但被公司不认可),想转 JAVA 开发(但又没有工作经验,惧怕面试),想用微服务架构重构(面对现有庞大的单体应用程序,有心无力),那么请关注右侧的公众号私信我,或许我可以帮到你一些~~~
一般情况下,我们会使用 rabbitmq_management 插件,通过 Web UI 的方式来监控和操作 RabbitMQ(端口 15672),但有时候命令的方式会更加方便一些,RabbitMQ 提供了 CLI 管理工具 rabbitmqadmin ,其实就是基于 RabbitMQ 的 HTTP API,用 Python 写的一个脚本。
另外,除了 rabbitmqadmin ,有个人也写了一个 rabbitmq-dump-queue 脚本,用于抓取 Queue 队列,用文件进行存储,但使用下来,感觉还是官方的 rabbitmqadmin 比较好些。
rabbitmqadmin 提供了下面功能:
- 列出 exchanges, queues, bindings, vhosts, users, permissions, connections and channels。
- 创建和删除 exchanges, queues, bindings, vhosts, users and permissions。
- 发布和获取消息,以及消息详情。
- 关闭连接和清空队列。
- 导入导出配置。
使用 rabbitmqadmin 的时候,我们需要理解 RabbitMQ 的基本概念,先回顾一下:
RabbitMQ 概念:
| 概念 | 详解 |
|---|---|
| Exchange | 消息交换机,它指定消息按什么规则,路由到哪个队列 |
| Queue | 消息队列,每个消息都会被投入到一个或多个队列 |
| Binding | 绑定,它的作用就是把 exchange 和 queue 按照路由规则绑定起来 |
| Routing Key | 路由关键字,exchange 根据这个关键字进行消息投递 |
| Vhost | 虚拟主机,可以开设多个 vhost,用作不同用户的权限分离 |
| Producer | 消息生产者,就是投递消息的程序 |
| Consumer | 消息消费者,就是接受消息的程序 |
| Channel | 消息通道,在客户端的每个连接里,可建立多个 channel,每个 channel 代表一个会话任务 |
RabbitMQ 流程:

RabbitMQ 投递过程:
- 1. 客户端连接到消息队列服务器,打开一个 channel。
- 2. 客户端声明一个 exchange,并设置相关属性。
- 3. 客户端声明一个 queue,并设置相关属性。
- 4. 客户端使用 routing key,在 exchange 和 queue 之间建立好绑定关系。
- 5. 客户端投递消息到 exchange。
- 6. 客户端从指定的 queue 中消费信息。
不理解?没关系,看下面。
接下来,我们就用 rabbitmqadmin ,来演示上面 RabbitMQ 投递过程。
如果我们安装了rabbitmq_management插件,可以打开http://node1:15672/cli/页面,下载 rabbitmqadmin。
或者直接进行下载:
[root@node1 ~]# wget http://node1:15672/cli/rabbitmqadmin
然后移到PATH目录,并赋予权限:
[root@node1 ~]# mv rabbitmqadmin /usr/local/bin
[root@node1 ~]# sudo chmod 777 /usr/local/bin/rabbitmqadmin
查看 rabbitmqadmin 命令:
[root@node1 ~]# rabbitmqadmin -help
Usage
=====
rabbitmqadmin [options] subcommand
...
创建一个test队列:
[root@node1 ~]# rabbitmqadmin declare queue name=test durable=true
queue declared
[root@node1 ~]# rabbitmqadmin list queues
+------+----------+
| name | messages |
+------+----------+
| test | 0 |
+------+----------+
需要注意:durable=true表示持久化,如果没有创建 Exchange,RabbitMQ 会使用默认的 Exchange,以及创建一个 Binding,这也就是为什么下面发布消息,可以成功的原因。
发布一条消息:
[root@node1 ~]# rabbitmqadmin publish routing_key=test payload="hello world"
Message published
[root@node1 ~]# rabbitmqadmin list queues
+------+----------+
| name | messages |
+------+----------+
| test | 1 |
+------+----------+
消费一条消息(查看消息内容):
[root@node1 ~]# rabbitmqadmin get queue=test requeue=true
+-------------+----------+---------------+-------------+---------------+------------------+------------+-------------+
| routing_key | exchange | message_count | payload | payload_bytes | payload_encoding | properties | redelivered |
+-------------+----------+---------------+-------------+---------------+------------------+------------+-------------+
| test | | 0 | hello world | 11 | string | | False |
+-------------+----------+---------------+-------------+---------------+------------------+------------+-------------+
[root@node1 ~]# rabbitmqadmin list queues
+------+----------+
| name | messages |
+------+----------+
| test | 1 |
+------+----------+
[root@node1 ~]# rabbitmqadmin get queue=test requeue=false
+-------------+----------+---------------+-------------+---------------+------------------+------------+-------------+
| routing_key | exchange | message_count | payload | payload_bytes | payload_encoding | properties | redelivered |
+-------------+----------+---------------+-------------+---------------+------------------+------------+-------------+
| test | | 0 | hello world | 11 | string | | True |
+-------------+----------+---------------+-------------+---------------+------------------+------------+-------------+
[root@node1 ~]# rabbitmqadmin list queues
+------+----------+
| name | messages |
+------+----------+
| test | 0 |
+------+----------+
需要注意:requeue=true表示查看队列,不消费;requeue=false表示查看队列,进行消费。
我们查看下上面创建队列后,默认创建的 Binding:
[root@node1 ~]# rabbitmqadmin list bindings
+--------+-------------+-------------+
| source | destination | routing_key |
+--------+-------------+-------------+
| | test | test |
+--------+-------------+-------------+
可以看到,使用的默认 Exchange 是空字符串(系统中的第一个 Exchange,Binding 中的 source 部分),并且这个默认的 Exchange 是direct类型(也就是一对一模式),这种隐式调用确保了消息准确投递。
另外,再说一下 Binding 中的三个概念:
- Source:源头的意思,其实就是 Exchange。
- destination:目的地的意思,其实就是 Queue。
- routing_key:路由键的规则,用于 Queue 匹配(比如
test.#)。
那下面我们就手动创建一下 Exchange:
[root@node1 ~]# rabbitmqadmin declare exchange name=my.topic type=topic
exchange declared
[root@node1 ~]# rabbitmqadmin list exchanges
+--------------------+---------+
| name | type |
+--------------------+---------+
| | direct |
| amq.direct | direct |
| amq.fanout | fanout |
| amq.headers | headers |
| amq.match | headers |
| amq.rabbitmq.log | topic |
| amq.rabbitmq.trace | topic |
| amq.topic | topic |
| my.topic | topic |
+--------------------+---------+
需要注意:这边我们只创建了一个 Exchange,类型为 Topic,和之前创建的test队列,目前没有任何关系。
然后再创建一个 Binding:
[root@node1 ~]# rabbitmqadmin declare binding source=my.topic destination=test routing_key=my.#
binding declared
[root@node1 ~]# rabbitmqadmin list bindings
+----------+-------------+-------------+
| source | destination | routing_key |
+----------+-------------+-------------+
| | test | test |
| my.topic | test | my.# |
+----------+-------------+-------------+
需要注意:我们上面创建的 Binding(最后那个),就是将名称为my.topic的 Exchange 和名称为test的 Queue 关联起来,并且设置的routing_key规则为my.#。
下面我们发布两条消息:
[root@node1 ~]# rabbitmqadmin publish routing_key=my.test exchange=my.topic payload="hello world by my.test"
Message published
[root@node1 ~]# rabbitmqadmin publish routing_key=my.test.test exchange=my.topic payload="hello world by my.test.test"
Message published
[root@node1 ~]# rabbitmqadmin list queues
+------+----------+
| name | messages |
+------+----------+
| test | 2 |
+------+----------+
需要注意,发布的两条消息都指定了my.topic的 Exchange,但消息的routing_key不同,但都成功发布到test队列了,原因是my.test和my.test.test都符合my.#路由规则。
下面,我们对两条消息进行消费:
[root@node1 ~]# rabbitmqadmin get queue=test requeue=false
+-------------+----------+---------------+------------------------+---------------+------------------+------------+-------------+
| routing_key | exchange | message_count | payload | payload_bytes | payload_encoding | properties | redelivered |
+-------------+----------+---------------+------------------------+---------------+------------------+------------+-------------+
| my.test | my.topic | 1 | hello world by my.test | 22 | string | | False |
+-------------+----------+---------------+------------------------+---------------+------------------+------------+-------------+
[root@node1 ~]# rabbitmqadmin get queue=test requeue=false
+--------------+----------+---------------+-----------------------------+---------------+------------------+------------+-------------+
| routing_key | exchange | message_count | payload | payload_bytes | payload_encoding | properties | redelivered |
+--------------+----------+---------------+-----------------------------+---------------+------------------+------------+-------------+
| my.test.test | my.topic | 0 | hello world by my.test.test | 27 | string | | False |
+--------------+----------+---------------+-----------------------------+---------------+------------------+------------+-------------+
[root@node1 ~]# rabbitmqadmin list queues
+------+----------+
| name | messages |
+------+----------+
| test | 0 |
+------+----------+
rabbitmqadmin 测试到这边,你应该就体会到了 RabbitMQ 的投递过程了吧,我们再对之前的投递过程完善下:
- 1. 声明一个 Queue,和谁都没有关系(只有名称和持久化配置)。
- 2. 声明一个 Exchange,和谁都没有关系(只有名称和 Exchange Type 配置)。
- 3. 声明一个 Binding,通过 source 和 destination,将 Queue 和 Exchange 关联起来,并通过 routing_key,设置发布消息的路由规则。
- 4. 发布一个消息,需要指定一个 Exchange,以及本身的路由名称。
- 5. 消费队列中的消息,需要指定一个 Queue。
rabbitmqadmin 命令汇总:
| 命令 | 解释 |
|---|---|
| rabbitmqadmin list users | 查看所有用户 User |
| rabbitmqadmin list users name | 查看所有用户名 Username |
| rabbitmqadmin list users tags | 查看所有用户角色 |
| rabbitmqadmin list vhosts | 查看所有虚拟主机 |
| rabbitmqadmin list connections | 查看所有连接 |
| rabbitmqadmin list exchanges | 查看所有路由 Exchange |
| rabbitmqadmin list bindings | 查看所有路由与队列的关系绑定 Binding |
| rabbitmqadmin list permissions | 查看所有角色的权限 Permission |
| rabbitmqadmin list channels | 查看所有通道 Channel |
| rabbitmqadmin list consumers | 查看所有消费者 Consumer |
| rabbitmqadmin list queues | 查看所有消息队列 Queue |
| rabbitmqadmin list nodes | 查看所有节点 Node |
| rabbitmqadmin show overview | 概览 Overview |
| rabbitmqadmin list bindings source destination_type destination properties_key | 查看所有路由与队列的关系绑定的详细信息 Binding |
| rabbitmqadmin declare queue name=test durable=true | 定义一个队列queue,durable=true代表持久化打开。 |
| rabbitmqadmin declare exchange name=my.fanout type=fanout | 定义一个Fanout路由 |
| rabbitmqadmin declare exchange name=my.direct type=direct | 定义一个Direct路由 |
| rabbitmqadmin declare exchange name=my.topic type=topic | 定义一个Topic路由 |
| rabbitmqadmin declare binding source=my.fanout destination=test routing_key=first | 定义 binding |
| rabbitmqadmin publish routing_key=test payload="hello world" | 发布一条消息 |
| rabbitmqadmin publish routing_key=my.test exchange=my.topic payload="hello world" | 使用路由转发消息 |
| rabbitmqadmin get queue=test requeue=true | 查看消息,不消费 |
| rabbitmqadmin get queue=test requeue=false | 查看消息,并消费 |
| rabbitmqadmin purge queue name=test | 删除队列中的所有消息 |
| rabbitmqadmin delete queue name=hello | 删除消息队列 Queue |
| rabbitmqadmin delete user name=test | 删除用户 User |
| rabbitmqadmin delete exchange name=test | 删除路由器 Exchange |
| rabbitmqadmin delete binding source='kk' destination_type=queue destination=test properties_key=test | 删除路由器与消息队列的关系绑定 Binding |
| rabbitmqadmin -f raw_json list users | raw_json 格式化输出 |
| rabbitmqadmin -f long list users | 格式化输出 |
| rabbitmqadmin -f pretty_json list users | pretty_json 格式化输出 |
| rabbitmqadmin -f kvp list users | 格式化输出 |
| rabbitmqadmin -f tsv list users | 格式化输出 |
| rabbitmqadmin -f table list users | table 格式化输出 |
| rabbitmqadmin -f bash list users | bash 格式化输出 |
参考资料:
- Management Command Line Tool(官网)
- RabbitMQ 的CLI管理工具 rabbitmqadmin(推荐)
- 05_RabbitMQ 的CLI管理工具 rabbitmqadmin
RabbitMQ CLI 管理工具 rabbitmqadmin(管理和监控)的更多相关文章
- 使用代码管理工具(git)管理代码的常用指令合集
create a new repository on the command line echo "# test" >> README.md git init git ...
- docker-6 管理工具
Shipyard 是一个基于 Web 的 Docker 管理工具,支持多 host,可以把多个 Docker host 上的 containers 统一管理:可以查看 images,甚至 build ...
- 安装 SQL SERVER 2008 必须使用 "角色管理工具" 错误 的 解决方案 (转)
刚在服务器(Win2008)上安装SqlServer2008的时候出现了这么一个报错——必须使用“角色管理工具”安装或配置Microsoft .NET Framework 3.5 SP1.一开始以为是 ...
- Microsoft强大团队(源代码)管理工具--TFS2010 与vs结合
今天看了与vs 集成原理工具 TFS 2010, 角色分配.项目管理.开发源代码管理.任务分配管理.测试文档管理及跟踪等管理流程.代码版本的分支与合并等等,功能好强大啊. 以下将其安装配置简要介绍(以 ...
- Redis Desktop Manager桌面管理工具
Redis Desktop Manager桌面管理工具,方便管理我们放在redis中的各个缓存 及16个数据库 http://redisdesktop.com/download
- supervisor:进程管理工具
一,安装(任何一种方式) apt-get install supervisor easy_install supervisor pip install supervisor 二,配置 配置superv ...
- redis的管理工具
phpredisadmin工具 rdbtools管理工具 saltstack管理redis 通过codis完成redis管理 一:phpredisadmin工具:类似于mysqladmin管理mysq ...
- elk中es集群web管理工具cerebro
cerebo是kopf在es5上的替代者 安装es虽然不能再root下运行,但是cerebro 可以 run as root is ok wget https://github.com/lmeneze ...
- ASP.NET 网站管理工具
ylbtech-Miscellaneos:ASP.NET 网站管理工具 1. 网站管理工具概述返回顶部 网站管理工具概述 介绍 使用网站管理工具,可以通过一个简单的 Web 界面来查看和管理网站配置. ...
随机推荐
- h1-h3使用
一个页面也就只允许出现一个h1标签.内容页文章的标题,是seo中使用最多的地方,基本的文章页面标题都是使用h1标签.一.<h1>用来修饰网页的主标题,一般是网页的标题 ,文章标题,< ...
- UMeditor控制多张图片上传顺序
多张图片上传的顺序,受到用户使用习惯.插件上传和插件插入页面顺序的影响. 估计是考虑到上传性能,官方没有提供UMeditor控制展示顺序的配置.在上传过程中,用户点击拖动的第一张图片,将作为文件数组中 ...
- Nginx下完美解决WordPress的伪静态 (wordpress 迁移后 导致 页面404)
直奔主题 如何设置WordPress在 Nginx下的伪静态 第一步:按照文章名为例,登陆后台按照箭头顺序修改固定连接,点击保存更改 第二步:登陆宝塔面板后台,按照文件路径 找到属于要配置域名的con ...
- 使用X509Certificate2类操作证书文件
public class CertHelper { string pfxPath = @"E:\开发辅助项目\cert\taisuyuanqing.pfx"; string cer ...
- day20.序列化模块
参考云游道士:https://www.cnblogs.com/yyds/p/6563608.html 1.什么是序列化 序列化就是将字典,数字等数据类型转换为字符串数据类型 所说的序列就是字符串 2. ...
- pycharm 记录
一.pycharm字体放大.缩小的设置 File —> setting —> Keymap —>在搜寻框中输入:increase —> Increase Font Size(双 ...
- vue分类筛选方法,filer
使用computed 方法来过滤筛选数据;也可以使用methods 方式来筛选过滤数据 代码如下: <body> <div id="app"> <ul ...
- angular之表达式
1.作用:使用表达式把数据绑定到HTML. 2.语法:表达式写在双打括号内:{{expression}} 3.比较:表达式作用类似于ng-bind指令:建议更多的使用指令. 4.AngularJS表达 ...
- Linux学习之shell
通配符 *:表示从它所在位置开始到某个符合条件的结束符之间的任何字符 ?:表示它所在位置上的任何可能的单个字符 []:表示[]中所包含字符的任何一个 特殊键 ctrl+c #停止当前程序执行 ctr ...
- 团队作业第六次—团队Github实战训练
作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 团队作业第六次-团队Github实战训练 团队目标 搭建一个相对公平公正的抽奖系统,根据QQ聊天记录,完成从统计参与抽 ...