RabbitMQ(四)佇列結構

2022-07-09 09:39:10 字數 1816 閱讀 1619

一、佇列結構

通常佇列由兩部分組成:

1、amqqueue,負責amqp協議相關的訊息處理,即接收生產者發布的訊息、向消費者投遞訊息、處理訊息confirm、acknowledge等等

2、backingqueue,它提供了相關的介面供amqqueue呼叫,完成訊息的儲存以及可能的持久化工作等。

backingqueue又由5個子佇列組成:q1, q2, delta, q3和q4。

二、在backingqueue中訊息的狀態

rabbitmq中的訊息一旦進入佇列,不是固定不變的,它會隨著系統的負載在佇列中不斷流動,訊息的不斷發生變化。

有如下4個狀態:

1、alpha:訊息的內容和訊息索引都在ram中。q1和q4的狀態。

2、beta:訊息的內容儲存在disk上,訊息索引儲存在ram中。q2和q3的狀態。

3、gamma:訊息內容儲存在disk上,訊息索引在disk和ram都有。q2和q3的狀態。

4、delta:訊息內容和索引都在disk上。delta的狀態。

對於持久化的訊息,訊息內容和訊息所有都必須先儲存在disk上,才會處於上述狀態中的一種,而gamma狀態的訊息是只有持久化的訊息才會有的狀態。

三、訊息的流動

如果訊息投遞的目的佇列是空的,並且有消費者訂閱了這個佇列,那麼該訊息會直接傳送給消費者,不會經過佇列這一步。

當訊息無法直接投遞給消費者時,需要暫時將訊息存入佇列,以便重新投遞。

進入佇列的訊息,一般會按照q1->q2->delta->q3->q4的順序進行流動,但是並不是每條訊息都一定會經歷所有的狀態,這個取決於當前系統的負載狀況。

引起訊息流動主要有兩方面因素:

1、消費者獲取訊息

2、由於記憶體不足引起訊息換出到磁碟

四、記憶體不足導致的訊息流動

在執行時,rabbitmq會根據訊息傳遞的速度定期計算乙個當前記憶體中能夠儲存的最大訊息數量(target_ram_count),如果alpha狀態的訊息數量大於此值,則會引起訊息的狀態轉換,多餘的訊息可能會轉換到beta、gama或者delta狀態。

五、消費引起的訊息流動

消費者獲取訊息也會引起訊息的狀態轉換。

當消費者獲取訊息時,

1、從q4中獲取訊息,如果獲取成功則返回。

2、如果q4為空,則嘗試從q3中獲取訊息,系統首先會判斷q3是否為空,如果為空則返回隊列為空,即此時佇列中無訊息。

3、如果q3不為空,則取出q3中的訊息,進而再判斷此時q3和delta中的長度,如果都為空,則可以認為 q2、delta、 q3、q4 全部為空,此時將q1中的訊息直接轉移至q4,下次直接從 q4 中獲取訊息。

4、如果q3為空,delta不為空,則將delta的訊息轉移至q3中,下次可以直接從q3中獲取訊息。

在將訊息從delta轉移到q3的過程中,是按照索引分段讀取的,首先讀取某一段,然後判斷讀取的訊息的個數與delta中訊息的個數是否相等,如果相等,則可以判定此時delta中己無訊息,則直接將q2和剛讀取到的訊息一併放入到q3中,如果不相等,僅將此次讀取到的訊息轉移到q3。

在系統負載較高時,訊息若不能很快被消費掉,這些訊息就會進入到很深的佇列中去,這樣會增加處理每個訊息的平均開銷。

因為要花更多的時間和資源處理「堆積」的訊息,如此用來處理新流入的訊息的能力就會降低,使得後流入的訊息又被積壓到很深的佇列中,繼續增大處理每個訊息的平均開銷,繼而情況變得越來越惡化,使得系統的處理能力大大降低。

資料結構(四)佇列

1 特點 2 主要實現 public inte ce queueextends collection一般peek poll offer方法跟其他類似方法的區別在於為空會返回null 1 特點 2 介面原始碼 public inte ce dequeextends queue提供了在兩端移除 新增的相...

資料結構(四)佇列

1 特點 2 主要實現 3 關係圖 public inte ce queueextends collection 複製 一般peek poll offer方法跟其他類似方法的區別在於為空會返回null 1 特點 2 介面原始碼 public inte ce dequeextends queue 複製...

專案四 佇列陣列

問題及 2015,煙台大學計算機與控制工程學院 完成日期 2015年10月14日 問題描述 建立10個佇列,分別編號為0 9 處理為佇列陣列,編號即下標 輸入若干個正整數,以數字0作為結束。設輸入的值為x,其個位數字的大小為i,則將x插入到編號為i的佇列中。最後輸出所有的非空佇列。要求將佇列處理成鏈...