預取值
更新時間 2024-09-11 15:36:24
最近更新時間: 2024-09-11 15:36:24
分享文章
本章節主要介紹分布式消息服務RabbitMQ的預取值特性。
使用場景
設置預取值可以限制未被確認的消息個數,一旦消費者中未被確認的消息數量達到設置的預取值,服務端將不再向此消費者發送消息,除非至少有一個未被確認的消息被確認。設置預取值本質上是一種對消費者進行流控的方法。
設置預取值時,需要考慮多種因素:
- 預取值設置太小可能會損害性能,RabbitMQ會一直在等待獲得發送消息的權限。
- 預取值設置太大可能會導致從隊列中取出大量消息傳遞給一個消費者,而使其他消費者處于空閑狀態。另外還需要考慮消費者的配置,消費者在處理消息時會將所有消息保存在內存中,太大的預取值會對消費者的性能產生負面影響,甚至可能會導致消費者崩潰。
更多關于預取值的說明,請參考。
如何設置合適的預取值?
- 如果您只有一個或很少幾個消費者在處理消息,建議一次預取多條消息,盡量讓客戶端保持忙碌。如果您的處理時間和網絡狀態穩定,則只需將總往返時間除以每條消息在客戶端的處理時間即可獲得估計的預取值。
- 在消費者多且處理時間短的情況下,建議使用較低的預取值。過低的預取值會使消費者閑置,因為消費者在處理完消息后需要等待下一批的消息到達。過高的值可能會使單個消費者忙碌,其他消費者處于空閑狀態。
- 在消費者多且處理時間很長的情況下,建議您將預取值設置為1,以便消息在所有消費者間均勻分布。
說明如果客戶端配置的消息確認機制為自動確認,則設置的預取值無效,已確認的消息會從隊列中刪除。
設置預取值
以下示例演示在Java客戶端為單個消費者設置預取值為10。
ConnectionFactory factory = new ConnectionFactory();
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.basicQos(10, false);
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume("my_queue", false, consumer);
在Java客戶端中,global的默認值為 false ,因此以上示例可以簡單地寫為 channel.basicQos(10) 。
global取值的含義如下:
表1 global取值說明
| global取值 | 說明 |
|---|---|
| false | 分別作用于通道上的每個新消費者。 |
| true | 在通道上的所有消費者之間所共享。 |