1. 程式人生 > >關於RabbitMQ叢集的一些知識點彙總

關於RabbitMQ叢集的一些知識點彙總

一、如何選擇RabbitMQ的訊息儲存方式?

RabbitMQ對queue中message的儲存有兩種方式:disc和ram。

如果採用disc,則需要對exchange/queue/delivery mode都要設定成durable模式。

disc方式的好處是當RabbitMQ失效了,message仍然可以在重啟之後恢復;而使用ram方式,RabbitMQ處理message的效率要高很多,ram和disc兩種方式的效率比大概是3:1。

所以如果在有其它HA手段保障的情況下,選用ram方式是可以提高訊息佇列的工作效率的。

二、當訊息傳送的速率超過了RabbitMQ的處理能力時該怎麼辦?

RabbitMQ會自動減慢這個連線的速率,讓client端以為網路頻寬變小了,傳送訊息的速率會受限,從而達到流控的目的。 使用“rabbitmqctl list_connections”檢視連線,如果狀態為“flow”,則說明這個連線處於flow-control 狀態。

三、RabbitMQ叢集結構

RabbitMQ基於Erlang編寫,天然支援clustering。叢集是保證可靠性的一種方式,同時可以通過水平擴充套件以達到增加訊息吞吐能力的目的。

上圖中是三個節點的RabbitMQ叢集,Exchange A的metadata資訊在所有節點上是一致的,queue的完整資訊則只在它建立的那個節點上。每個RabbitMQ節點通常以“

[email protected]”表示,所以hostname在執行RabbitMQ的節點中很重要。注意:如果更改了hostname,需要重置RabbitMQ內部的資料庫,否則服務無法工作。

四、資料流動

RabbitMQ維護著四種類型的metadata: queue/exchange/binding/vhost,在叢集中這些資訊被同步到每個節點,因此當用戶訪問任何一個節點時,通過rabbitmqctl查詢到的queue/user/exchange等資訊都是相同的。

通常我們將這些資訊儲存到磁碟上,也就是查詢RabbitMQ狀態時的“disc”方式,以便叢集重啟時可以根據儲存的metadata資訊重建exchange等。

對於exchange來講,它的所有資訊就是一個exchange名字加上一個查詢表。查詢表中記錄了所有的queue binding。當message被髮送到exchange時,client連線的channel對routing key進行比對,根據binding進行正確的轉發。

對於Queue來講,雖然它的metadata在每個節點上都有,但只有在它被建立的那個RabbitMQ節點上才具有完整的資訊:比如state/contents等,這個node被稱為此queue的owner node。其他節點只知道這個queue的metadata資訊和一個指向queue的owner node的指標。

如果一個client訪問RabbitMQ的節點上沒有所需要queue的完整資訊,RabbitMQ將根據這個指標將請求轉發到owner node。所以一個客戶端最好一直只和一個節點連線,這樣效率高一點。

Mnesia是RabbitMQ中的資料庫,它是內嵌在Erlang中的no-SQL資料庫。Exchange/Queue/Binding等的metadata資訊都儲存在mnesia的資料庫檔案中。關於RabbitMQ的叢集資訊也儲存在這裡。Rabbitmqctl的reset操作實際上就是清空了mnesia資料庫所在目錄的內容。

 

 

 

 

 

參考:

  1. https://blog.csdn.net/qq_34039315/article/details/77619736