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

2020/08/02閱讀時間約 1 分鐘
假設我們每個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。
延伸閱讀:
為什麼會看到廣告
91會員
259內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
發表第一個留言支持創作者!