rabbitmq--通過rabbitmqctl建立exchange和queue
一般來說,exchange和queue都是由我們的業務程式在執行過程中連線到rabbitmq並建立的。然而也有些特殊的場景,要求業務程式在連線使用rabbitmq之前,相關的exchange和queue必須預先建立好。這個時候對於測試人員或者運維人員來說,通常的做法是在rabbitmq安裝完成後,啟用rabbitmq_management外掛,然後在web控制檯進行操作來建立exchange和queue,並完成繫結動作。
對於當前都是講究自動化運維的時代,這種方式顯然是不能自動化的。那麼一些可能的改進的方式是搞個rabbitmq的客戶端寫個小程式,比如python的pika,通過在指令碼中呼叫這些程式,並傳遞相應的引數完成exchange,queue的建立以及對應的繫結操作。
其實通過rabbitmq本身提供的rabbitmqctl命令,同樣能完成exchange和queue的建立,例如:
rabbitmqctl eval 'rabbit_exchange:declare({resource, <<"/">>, exchange, <<"test-topic">>}, topic, true, false, false, []).' rabbitmqctl eval 'rabbit_amqqueue:declare({resource, <<"/">>, queue, <<"test-queue">>}, true, false, [], none).' rabbitmqctl eval 'rabbit_binding:add({binding, {resource, <<"/">>, exchange, <<"test-topic">>}, <<"*.com.cn">>, {resource, <<"/">>, queue, <<"test-queue">>}, []}).'
這三條命令執行後的最終結果是:在 / 虛擬主機下建立了topic型別的,持久化的,名為 test-topic的exchange,建立了持久化的,名為 test-queue 的queue,該佇列以 *.com.cn 的routing key繫結到了 test-topic這個exchange上。
=================================================================
對於 rabbitmqctl eval 官網的文件裡解釋是:計算任意的erlang表示式的值。
其實知道一點erlang語法的,一眼就可以看出上面的例子裡,其實就是一個Module:Function(Arg)的呼叫。
這裡需要注意:括號後的那個 . 可別忘了。
那麼瞭解了這些後,剩下的就是exchange,queue建立及繫結動作應該呼叫哪個模組的哪個函式匯出函式,引數的意義和格式是怎樣的。
exchange的建立呼叫rabbit_exchange的declare函式,該函式具體宣告為:
declare(XName, Type, Durable, AutoDelete, Internal, Args).
XName: exchange的名稱, 具體格式為 {resource, VHost, exchange, Name}
VHost為虛擬主機的名稱
Name為exchange的名稱
注意 VHost 和 Name 限定為binary形式, 即<<>>
Type: exchange的型別, 可選值為 direct, headers, topic, fanout
Durable: 是否需要持久化, true表示持久化, false為非持久化
AutoDelete: 是否自動刪除, true表示自動刪除, false為非自動刪除
Internal: 是否為rabbitmq內部使用, true表示是內部使用, false表示不是內部使用
Args: exchange的其他選項引數, 一般設定為 []
補充說明:
自動刪除的觸發條件是:當繫結到該exchange上的所有queue和exchange都已經解除繫結時,rabbitmq自動刪除該exchange。
內部使用是指:客戶端不能直接向該exchange投遞訊息,只能由rabbitmq自己向這個exchange投遞訊息,一般用於exchange到exchange的繫結。另外,rabbitmq的trace機制使用的exchange也是internal型別。
queue的建立應呼叫rabbit_amqqueue模組的declare函式,該函式具體宣告為:
declare(QueueName, Durable, AutoDelete, Args, Owner).
QueueName: queue的名稱, 具體格式為 {resource, VHost, queue, Name}
VHost為虛擬主機的名稱, Name為queue的名稱
Durable: 是否需要持久化, true表示持久化, false為非持久化
AutoDelete: 是否自動刪除, true表示自動刪除, false為非自動刪除
Args: queue的其他選項引數, 包括訊息的優先順序, ttl, 佇列的最大長度等, 一般設定為 []
Owner: 用於queue的獨佔模式, 一般設定為 none
建立繫結關係是呼叫rabbit_binding模組的add函式,該函式具體宣告為:
add(Binding)
Binding: 繫結關係, 可以是exchange到exchange, 也可以是exchange到queue
具體格式為 {binding, Source, Key, Destination, Args}
Source 為 訊息源, 必須為exchange: {resource, VHost, exchange, Name}
Key 為 routing-key
Destination 為目的 {resource,VHost,exchange,XName} 或者 {resource, VHost, queue, QName}
Args 為其他選項引數, 一般設定為 []
回過頭來再看看前面例子中的命令,應該就不陌生了:)
=====================================================
總結:通過rabbitmqctl eval可以在命令列模式下完成exchange,queue的建立及繫結操作。這樣配合shell指令碼能較好的達到自動化的方式。