2020-08-02|閱讀時間 ‧ 約 2 分鐘

【Message Queue - RabbitMQ】消費者分發制度

假設我們每個Queue都只對應一個消費者,那麼就不會有分配問題,但如果今天我們有多個消費者的時候,這時候要怎麼分發?如何做到公平?

一、輪流分發
預設採輪流分發,假設有三個消費者同時消費,則如下圖,訊息平均分配給各個消費者處理。
這種分發方式並未考慮到Consumer的處理能力,假設Consumer1處理較慢,那麼被分配到訊息後勢必會堆積很多訊息在記憶體,如此一來會比較沒有效率一點,當有新的Consumer加入時那些堆積的訊息因為已經被分發到Consumer1了,所以新的Consumer也無法幫忙處理。

二、公平分發(依照處理能力)
上述的狀況下,只要Queue有訊息就立即往Consumer丟,此時如果能夠限制每個Consumer能夠處理的數量,那麼訊息就比較容易被依照處理能力分配,而RabbitMQ正好提供了這種Qos的配置,讓Consumer來告訴Server端自己一次能處理的量。
channel.basicQos($prefetchCount, $prefetchSize, $global)
  • $prefetchCount: 代表消費者一次能處理的量,在還沒回傳ack訊號前不會派發新的訊息。
  • $prefetchSize: 代表消費者一次能處理的訊息大小。
  • $global: true代表套用到整個connection, false則僅限於該channel,通常都配置為false。
延伸閱讀:

分享至
成為作者繼續創作的動力吧!
主軸圍繞於軟體科技, 除了過往經驗成章以外也持續學習新技能, 並將學習心法記錄與分享, 以期幫助相同道路之夥伴。 裡面包含著各種程式語言的疑難雜症解題技巧, 也提供資料庫、AI、認證與授權、工具庫...等技巧, 讓您自由找出您想要的解答, 如果您想要系統化的教學課程也歡迎至「🔒 阿Han的軟體心法實戰營」。
從 Google News 追蹤更多 vocus 的最新精選內容從 Google News 追蹤更多 vocus 的最新精選內容

阿Han的沙龍 的其他內容

發表回應

成為會員 後即可發表留言
© 2024 vocus All rights reserved.