前言
一般情況下,我們會使用 rabbitmq_management 插件,通過 Web UI 的方式來監控和操作 RabbitMQ(端口 15672),但有時候命令的方式會更加方便一些,
RabbitMQ 提供了 CLI 管理工具 rabbitmqadmin ,其實就是基於 RabbitMQ 的 HTTP API,用 Python 寫的一個腳本。
rabbitmqadmin 提供了下面功能:
- 列出 exchanges, queues, bindings, vhosts, users, permissions, connections and channels。
- 創建和刪除 exchanges, queues, bindings, vhosts, users and permissions。
- 發布和獲取消息,以及消息詳情。
- 關閉連接和清空隊列。
- 導入導出配置。
安裝rabbitmqadmin
如果我們安裝了rabbitmq_management
插件,可以打開http://node1:15672/cli/
頁面,下載 rabbitmqadmin。
或者直接進行下載:
wget http://node1:15672/cli/rabbitmqadmin
然后移到PATH
目錄,並賦予權限:
mv rabbitmqadmin /usr/local/bin
sudo chmod 777 /usr/local/bin/rabbitmqadmin
查看 rabbitmqadmin 命令:
[root@node1 ~]# rabbitmqadmin -help Usage ===== rabbitmqadmin [options] subcommand ...
如果出現以下提示:
[root@zk-mq-1 ~]# rabbitmqadmin -help /usr/bin/env: python3: No such file or directory
則需要安裝相應版本的python:
yum install python3
使用rabbitmqadmin
- 創建一個
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 命令匯總
命令 | 解釋 |
---|---|
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 格式化輸出 |
參考資料:
- https://www.cnblogs.com/xishuai/p/rabbitmq-cli-rabbitmqadmin.html
- https://www.jianshu.com/p/8414cd70bef1