RabbitMQ CLI 管理工具 rabbitmqadmin(管理和監控)
作者:田園裡的蟋蟀
出處:http://www.cnblogs.com/xishuai/
一般情況下,我們會使用 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 格式化輸出 |
參考資料: