惰性隊列
更新時間 2023-07-03 21:29:43
最近更新時間: 2023-07-03 21:29:43
分享文章
介紹 分布式消息服務RabbitMQ惰性隊列能力
使用場景
RabbitMQ從3.6.0版本開始引入了惰性隊列(Lazy Queue)的概念。惰性隊列會盡可能的將消息存入磁盤中,而在消費者消費到相應的消息時才會被加載到內存中,它的一個重要的設計目標是能夠支持更長的隊列,即支持更多的消息存儲。當消費者由于各種各樣的原因(比如消費者下線、宕機亦或者是由于維護而關閉等)而致使長時間內不能消費消息造成堆積時,惰性隊列就很有必要了
默認情況下,當生產者將消息發送到RabbitMQ的時候,隊列中的消息會盡可能的存儲在內存之中,這樣可以更加快速的將消息發送給消費者。即使是持久化的消息,在被寫入磁盤的同時也會在內存中駐留一份備份。當RabbitMQ需要釋放內存的時候,會將內存中的消息換頁至磁盤中,這個操作會耗費較長的時間,也會阻塞隊列的操作,進而無法接收新的消息。雖然RabbitMQ的開發者們一直在升級相關的算法,但是效果始終不太理想,尤其是在消息量特別大的時候
惰性隊列會將接收到的消息直接存入文件系統中,而不管是持久化的或者是非持久化的,這樣可以減少了內存的消耗,但是會增加I/O的使用,如果消息是持久化的,那么這樣的I/O操作不可避免,惰性隊列和持久化消息可謂是“最佳拍檔”。注意如果惰性隊列中存儲的是非持久化的消息,內存的使用率會一直很穩定,但是重啟之后消息一樣會丟失。
設置惰性隊列
隊列具備兩種模式:default和lazy,默認模式為default。lazy模式即為惰性隊列的模式,可以通過調用channel.queueDeclare方法的時候在參數中設置。
以下示例演示在Java客戶端通過調用channel.queueDeclare設置惰性隊列。
Map args = new HashMap();
args.put("x-queue-mode","lazy"); channel.queueDeclare("test_queue", false, false, false, args);