1. 程式人生 > >rabbitmq--通過rabbitmqctl建立exchange和queue

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指令碼能較好的達到自動化的方式。