惰性隊列
更新時間 2024-09-11 15:36:24
最近更新時間: 2024-09-11 15:36:24
分享文章
本文主要介紹分布式消息服務RabbitMQ的惰性隊列。
使用場景
默認情況下,RabbitMQ生產者生產的消息存儲在內存中,當需要釋放內存時,會將內存中的消息換頁至磁盤中。換頁操作會消耗較長的時間,且換頁過程中隊列無法處理消息。
如果生產速度過快(例如執行批處理任務),或者消費者由于各種原因(例如消費者下線、宕機)長時間內無法消費消息,導致消息大量堆積,使得內存使用率過高,換頁頻繁,可能會影響其他隊列的消息收發。這種場景下,建議您啟用惰性隊列。
惰性隊列(Lazy Queue)會盡可能的將消息存入磁盤中,在消費者消費到相應的消息時才會被加載到內存中,這樣可以減少內存的消耗,但是會增加I/O的使用,影響單個隊列的吞吐量。惰性隊列的一個重要的設計目標是能夠支持更長的隊列,即支持更多的消息存儲/消息堆積。
在以下情況下,推薦使用惰性隊列:
- 隊列可能會產生消息堆積
- 隊列對性能(吞吐量)的要求不是非常高,例如TPS 1萬以下的場景
- 希望隊列有穩定的生產消費性能,不受內存影響而波動
處于以下情況時,無需使用惰性隊列:
- RabbitMQ需要高性能的場景
- 隊列總是很短(即隊列中沒有消息堆積)
- 設置了最大長度策略
更多關于惰性隊列的說明,請參考。
設置惰性隊列
隊列具備兩種模式:default和lazy,默認模式為default。lazy模式即為惰性隊列的模式,可以通過調用channel.queueDeclare方法的時候在參數中設置,也可以通過Policy的方式設置。如果一個隊列同時使用這兩種方式設置的話,Policy的方式具備更高的優先級。
- 以下示例演示在Java客戶端通過調用channel.queueDeclare設置惰性隊列。
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-queue-mode", "lazy");
channel.queueDeclare("myqueue", false, false, false, args);
- 以下示例演示在RabbitMQ WebUI頁面通過Policy的方式設置惰性隊列。
圖1 通過Policy的方式設置惰性隊列

