您好,登錄后才能下訂單哦!
怎么進行RabbitMQ Federation插件的分析,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
在文章開始之前,我們先介紹一下聯邦機制的基本概念。聯邦機制的實現,依賴于RabbitMQ的Federation插件,該插件的主要目標是為了RabbitMQ可以在多個 Broker節點或者集群中進行消息的無縫傳遞。
Federation插件可以讓多個交換器和多個隊列進行聯邦。一個聯邦交換器或者一個聯邦隊列接受上游(位于其他Broker上的交換器和隊列)消息。聯邦交換器能夠將原本發送給上游交換器(upstream exchange)的消息路由到本地的某個隊列中;聯邦隊列則允許一個本地消費者接收到來自上游隊列(upstream queue)的消息。
下面先假設一種場景,BrokerA服務部署在上海,BrokerB服務部署在北京。來自上海的ClientA向BrokerA的exchangeA發送消息網絡延遲很小,但是北京的ClientB向BrokerA的exchangeA發送消息那么將會面臨網絡延遲的問題。Federation機制則可以幫助我們解決這個問題。
首先在BrokerA的exchangeA上與北京的BrokerB建立一條單向的Federation Link。此時Federation插件會在BrokerB上建立一個同名的交換器(可以配置,默認同名),并且還會建立一個內部交換器federation:exchangeA->Broker B(其中Broker為集群名稱)通過相同的綁定建進行綁定,于此同時Federation插件會建立一個federation:exchangeA->Broker B(BrokerB為集群名稱),并且將內部交換器federation:exchangeA->Broker B綁定到該隊列。
Federation插件會在隊列federation:exchangeA->Broker B與BrokerA中的交換器exchangeA之間建立一條AMQP連接來實時地消費隊列federation:exchangeA->Broker B中的數據。這些操作都是內部的,對外部業務客戶端來說這條Federation link建立在BrokerA的exchangeA和BrokerB的exchangeA之間。
此時ClientB可以以較小的網絡延遲向BrokerB的exchangeA發送消息,并且該消息會被正確路由到BrokerA中的exchangeA中,通過Federation插件我們可以以較小的網絡延遲向與客戶端屬于不同地域的Broker節點發送消息。
"max_hops=1"表示一條消息最多被轉發的次數為1。
默認的交換器(每個vhost下都會默認創建一個名為""的交換器)和內部交換器,不能對其使用Federation的功能。
隊列queue1和queue2原本在broker2中,由于某種需求將其配置為federated queue并將broker1作為upstream。Federation插件會在broker1上創建同名的隊列queue1和queue2,與broker2中的隊列queue1和queue2分別建立兩條單向獨立的Federation link。當有消費者ClientA連接broker2并通過Basic.Consume消費隊列queue1(或queue2)中的消息時,如果隊列queue1(或queue2)中本身有若干消息堆積,那么ClientA直接消費這些消息,此時broker2中的queue1(或queue2)并不會拉取broker1中的queue1(或queue2)的消息;如果隊列queue1(或queue2)中沒有消息堆積或者消息被消費完了,那么它會通過Federation link拉取在broker1中的上游隊列queue1(或queue2)中的消息(如果有消息),然后存儲到本地,之后再被消費者ClientA進行消費。
和federated exchange不同,一條消息可以在聯邦隊列間轉發無限次。兩個隊列可以互為聯邦隊列。
如果兩個隊列互為聯邦隊列,隊列中的消息除了被消費,還會轉向有多余消費能力的一方,如果這種"多余的消費能力"在broker1和broker2中來回切換,那么消費也會在broker1和broker2中的隊列queue中來回轉發
federation queue只能使用Basic.Consume進行消費,并且不具備傳遞性。
Federation插件默認在RabbitMQ發布包中,執行rabbitmq-plugins enable rabbitmq_federation命令可以開啟Federation功能。rabbitmq-plugins enable rabbitmq_federation命令會同時開啟amqp_client插件。如果要開啟Federation的管理插件,需要執行rabbitmq-plugins enable rabbitmqfederation_management命令。
當需要在集群中使用Federation功能的時候,集群中所有的節點都應該開啟Federation插件。
在前面的章節中我們搭建了一個3個節點的rabbitmq集群(假設在上海),我們在搭建一個兩個節點的集群(假設在北京),這個讀者自行去搭建吧。在我們第一個集群中默認的vhost下有一個exchangeA和queueA,我們北京的一個客戶端需要向exchangeA中發消息,為了減輕網絡延遲,我們使用聯邦機制,將北京的集群作為上行資源,下面我們講一下配置。
首先在上海集群中配置Federation Upstreams,配置如下圖:
name:定義這個upstream的名稱,必填項
uri:定義upstream的AMQP連接,我們這里設置的是amqp://upstreamer:123456@rabbit111:5672(這里是一個北京集群一個節點地址),格式amqp://username:password@host:port
Prefetch count:定義Federation內部緩存的消息條數,即在收到上游消息之后且在發送到下游之前緩存的消息條數。
Reconnect delay:Federation link由于某種原因斷開之后,需要等待多少秒開始重新建立連接。
Acknowledgement Mode:定義Federation link 的消息確認方式。其有3種:on-confirm、on-publish、no-ack。默認為on-confirm,表示在接收到下游的確認消息(等待下游的Basic.Ack)之后再向上游發送消息確認,這個選項可以確保網絡失敗或者Broker宕機時不會丟失消息,但也是處理速度最慢的選項。如果設置為on-publish,則表示消息發送到下游后(并需要等待下游的Basic.Ack)再向上游發送消息確認,這個選項可以確保在網絡失敗的情況下不會丟失消息,但不能確保Broker宕機時不會丟失消息。no-ack表示無須進行消息確認,這個選項處理速度最快,但也最容易丟失消息。
Trust User-ID:設定Federation是否使用"Validated User-ID" 這個功能。如果設置為false或者沒有設置,那么Federation會忽略消息的user_id 這個屬性;如果設置為true,則Federation只會轉發user_id為上游任意有效的用戶的消息。
Exchange:指定upstream exchange的名稱,默認情況下和federated exchange同名,這里我們指定的是beijingExchange
Max hops:指定消息被丟棄前在Federation link中最大的跳轉次數。默認為1。注意即使設置max-hops參數為大于1的值,同一條消息也不會在同一個Broker中出現2次,但是有可能會在多個節點中被復制。
Expires:指定Federation link斷開之后,federated queue所對應的upstream queue的超時時間,默認為"none",表示為不刪除,單位為ms。這個參數相當于設置普通隊列的x-expires參數。設置這個值可以避免Federation link斷開之后,生產者一直在向北京集群中的upstream exchange發送消息,這些消息又不能被轉發到上海的集群中而被消費掉,進而造成upstream exchange中有大量的消息堆積。
Message TTL:為federated queue所對應的upstream queue設置,相當于普通隊列的x-message-ttl參數。默認為"none",表示消息沒有超時時間。
HA policy:為federated queue所對應的upstream queue設置,相當于普通隊列的x-ha-policy參數,默認為 "none",表示隊列沒有任何HA。
Queue:執行upstream queue的名稱,默認情況下和federated queue同名
在配置完了Federation Upstreams之后,再定義一個Policy用于匹配交換器exchangeA,并且使用剛才的Federation Upstreams配置,如下圖:當策略配置完畢之后,Federation將會在北京的集群上建立一個beijingExchange,并建立Federation link,如下圖:
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。