1. 程式人生 > 實用技巧 >RabbitMQ CLI 管理工具 rabbitmqadmin(管理和監控)

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.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 測試到這邊,你應該就體會到了 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 格式化輸出

參考資料: