假設我們每個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。
延伸閱讀: