rabbitmq訊息分發及應答解析

2021-09-02 23:05:32 字數 1252 閱讀 6455

訊息分發

官網的示例中介紹了預設情況下rabbitmqrabbitmq會乙個乙個的傳送資訊給下乙個消費者(consumer),而不考慮每個任務的時長等等,且是一次性分配,並非乙個乙個分配。平均的每個消費者將會獲得相等數量的訊息。這樣分發訊息的方式叫做round-robin。這可以表示為下圖: 

核心**展示

//第二個引數autoack設定成false表示關閉自動應答

channel.basicconsume(queue_name, false, consumer);  

while (true)

三、消費者負載均衡(prefetchcount代表consumer必須能夠處理給定數量訊息並正確發回回執之後,佇列才會給consumer分發資訊,否則不分發,可以通過prefetchcount限制consumer處理訊息數量)

預設情況下rabitmq會把佇列裡面的訊息立即傳送到消費者,無論該消費者有多少訊息沒有應答,也就是說即使發現消費者來不及處理,新的消費者加入進來也沒有辦法處理已經堆積的訊息,因為那些訊息已經被傳送給老消費者了。 

chanel.basicqos(prefetchcount) 

prefetchcount:會告訴rabbitmq不要同時給乙個消費者推送多於n個訊息,即一旦有n個訊息還沒有ack,則該consumer將block掉,直到有訊息ack。 

這樣做的好處是,如果系統處於高峰期,消費者來不及處理,訊息會堆積在佇列中,新啟動的消費者可以馬上從佇列中取到訊息開始工作。

圖示: 

上圖描述了這樣乙個過程:剛啟動時消費者c1、c2、c3均為空閒狀態,且它們的channel都設定了prefetch=1,佇列中有訊息1~n。下面按照各消費者收到訊息的時間順序說明整個過程。

c1收到訊息1開始處理。 

c2收到訊息2開始處理。 

c3收到訊息3開始處理。 

c2處理完訊息2並產生應答,可以看到圖中訊息2從佇列中移除了。 

c2收到訊息4開始處理,可以看到圖中訊息4被標記為已傳送狀態。 

c3處理完訊息3並產生應答,可以看到圖中訊息3從佇列中移除了。 

c3收到訊息5開始處理,可以看到訊息5被標記為已傳送狀態。 

上圖反應的就是直到c3收到訊息5並處理時的整個佇列中所有訊息的狀態。

RabbitMQ訊息應答 ack機制

執行乙個任務可能需要花費幾秒鐘,你可能會擔心如果乙個消費者在執行任務過程中掛掉了。一旦rabbitmq將訊息分發給了消費者,就會從記憶體中刪除。在這種情況下,如果正在執行任務的消費者宕機,會丟失正在處理的訊息和分發給這個消費者但尚未處理的訊息。但是,我們不想丟失任何任務,如果有乙個消費者掛掉了,那麼...

RabbitMQ學習第三章 訊息應答與訊息持久化

boolean autoack true 自動確認模式 一旦 rabbitmq 將訊息傳送給消費者 訊息就會從記憶體中刪除。這種情況下不安全,如果殺死正在執行的消費者,就會丟失正在處理的訊息 boolean autoack false 手動確認模式 如果有乙個消費者掛掉,就會交付給 其他的消費者來執...

SIP應答訊息分類

sip應答訊息指的是由uas或sip伺服器生成的,回應uac請求的訊息。應答訊息可能包含uac所需要的附加頭域資訊,也可能只是個簡單的,用於防止uac重發請求的確認訊息。有些應答訊息指示uac採取具體的額外步驟。我們將從結構的類別角度討論應答訊息。然後討論請求相關的詳細資訊。sip應答訊息分為六種型...