RabbitMQ——CLI 管理工具 rabbitmqadmin


 

前言

一般情況下,我們會使用 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.testmy.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM