2016-07-07 70 views
1

我對rabbitmq如何處理批量確認有疑問。我知道預取值是在達到其限制之前排隊的最大消息數。但是,我不確定ack是否自己管理,或者我是否需要在代碼中進行管理。RabbitMQ批量確認

哪種方法是正確的?

多組發送每個basicAck真

等到被認爲10個的ACK被髮送出去,只發送最後一個和AMQP會自動發送所有以前的隊列中。 (有多個設置爲真)

回答

1

關於Prefetch value is the max number of messages that will get queued before reaching its limit.的第一個更正 - 這不是預取值是什麼;預取值是消費者從隊列中「獲取」的未確認消息的數量。所以他們是分配給消費者的,但仍然在隊列中,直到他們被確認。引自here,當預取爲1

這告訴RabbitMQ的不是在 時間給出多個消息給工人。換句話說,不要向工作人員發送新消息 ,直到它處理並確認了前一個消息。

而對於你的問題:

我不知道如果ACK的自我管理,或者如果我要在代碼管理 這一點。

您可以設置自動應答標誌設置爲true,然後你可以說,the ack's manage themselves

+0

如果我將多個設置爲true,它如何知道一次或多少次確認?這是api剛剛管理的東西嗎?還是僅僅是在那個時候準備好了所有的東西?如果是這種情況,那麼如果我們真的想讓一些呃等等,那麼第二種情況是不是適當的呢? – JeremyK

+0

對不起,基本問題。我沒有使用AMQP的經驗,突然間我不得不提高它的性能:) – JeremyK

+0

@JeremyK我不確定多個,我從來沒有一個用例,它是適當的。你確定這是你真正需要的嗎?難道你不能通過汽車確認,或者一旦你完成了處理,就立刻一個接一個地確認。 – cantSleepNow

1

TL; DR多=真在某些情況下,速度更快,但需要更多的謹慎記賬和批量樣要求

消費者獲得的消息具有特定於該消費者的單調增長的id。 id是一個64位的數字(它實際上可能是一個無符號的32位,但是因爲Java沒有那麼長)稱爲遞送標籤。預取是消費者將收到的最多消息。

當你確認有多個true最高的交付標籤將確認所有與下傳送標記(較小的數字),消費者具有突出的UNACKED消息。顯然,如果你預讀的速度很快,那麼比每條消息都要快。

現在RabbitMQ知道消費者收到了消息(未消息的消息),但它不知道所有這些消息是否已被正確使用。因此,確保所有以前的消息都已被使用是開發人員的負擔。消費者將按順序傳遞消息(我相信客戶端在內部使用BlockingQueue),但取決於下游使用的庫/客戶端,消息可能不是。

因此,當您將消息一次性批量處理(例如事務處理或將一組消息發送到某個其他系統)或可靠地緩衝時,這一功能纔會起作用。通常,這是通過一個阻塞隊列完成的,然後定期排空隊列以將一組消息發送到下游系統。

另一方面,如果你是實時流式傳輸每條消息,那麼你不能真正做到這一點(即multiple = false)。

還有一個消息是該組中的壞的一個的情況下(例如,從內部隊列...不是兔隊列排水)和你不會到NACK壞之一。如果是這種情況,則不能使用多個= true

最後,如果你等待一定量的信息(而不是說時間)比預取越多,你將無限期地等待....不是一個好主意。您需要等待,消息的數量必須爲<=預取。

正如你可以看到它的相當平凡的正確使用多個= true