2017-09-07 440 views
1

是否可以使用auto-ack = false禁用預取?每次我確認一條消息時,我只想避免從隊列中讀取消息(預取)。我只想在我調用'consume_message'時讀取消息。設置prefetch_count = 0似乎不起作用,並將其視爲「無限制」。RabbitMq:使用auto-ack = false禁用預取(prefetch_count = 0)

已更新:
據我所知'prefetch_count'是客戶端緩存的消息數(本地讀入緩衝區)。例如,有一個用例:

(假設有我們連接到一個隊列,它有消息)

  1. 創建連接。
  2. 設置Basic.Qos(prefetch_count = 1)
  3. 開始消耗Basic.Consume
  4. 由於prefetch_count = 1個一個消息是已經傳輸到客戶端和準備好被讀取並標記作爲未確認
  5. 閱讀消息然後處理它。
  6. 然後消息是ack'd。一切從第4步開始。

我認爲設置prefetch_count爲0將避免步驟4,只有當你讀它的消息傳送 - 在客戶端沒有緩存。

回答

0

預取和自動確認不是這樣相關的。預取計數只是一個未確認的消息準備交付給特定的消費者。

假設您將預取計數設置爲N.如果將auto-ack設置爲true,則這意味着這些N個消息在接收時會被確認。如果將它設置爲false,這意味着您仍然收到N條消息,但在您手動確認它們之前,它們不會被確認。

對於最後一部分 - 嘗試設置prefetch_count爲1

還要檢查這個question和兩個答案。

+0

Hm ...文檔中說[鏈接](https://www.rabbitmq.com/amqp-0-9-1-reference.html):'如果沒有應答選項,預取計數將被忽略已設定「。現在還不清楚 - 客戶端消費了多少條消息? – eSZet

+0

我已經更新了我的問題,請看看 – eSZet

+0

您提出的問題(auto-ack = false和prefetch_count = 1)恰恰就是我更新部分問題的用例。但關鍵是步驟4.我想避免這一點。將預取計數設置爲0不起作用 - 這意味着沒有指定計數。我希望這很清楚。 – eSZet