訊息分發
官網的示例中介紹了預設情況下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應答訊息分為六種型...