使用 RabbitMQ 時,為什么設置了 delivery_mode: 1 的消息仍會被寫入磁盤?

使用 RabbitMQ 時,為什么設置了 delivery_mode: 1 的消息仍會被寫入磁盤?

rabbitmq:delivery_mode=1 消息為何仍寫入磁盤?

使用 RabbitMQ 時,設置 delivery_mode: 1 理應避免消息寫入磁盤,因為它表示非持久化消息。然而,實際情況中,即使設置了 delivery_mode: 1,消息發送速度仍然緩慢,RabbitMQ 管理界面顯示消息同時存在于內存和磁盤中。

問題現象

使用 delivery_mode: 1 發送消息,速度卻與 delivery_mode: 2 (持久化消息) 一樣慢。監控面板顯示 “內存中” 和 “持久化” 消息數量相同,這與預期不符。已確認消息確實設置了 delivery_mode: 1,但仍然寫入磁盤。

問題根源分析

問題可能與 RabbitMQ 的配置或運行環境有關。文章提到,在 kubernetes 環境中部署的隊列出現此問題,而本地 docker 環境則沒有。

可能的因素:

  1. 內存不足:可能性較低,因為沒有明顯的內存告警。
  2. 啟用特定特性:某些 RabbitMQ 特性可能導致此問題。

進一步觀察發現,隊列類型為 classic,無論 delivery_mode 設置為何值,”內存中” 和 “持久化” 消息數量總是相等。

解決方案

最終,問題在于 使用了 stream 隊列。stream 隊列可能默認啟用持久化,即使 delivery_mode: 1,消息也會寫入磁盤。

因此,遇到類似問題時,務必檢查是否使用了 stream 隊列。 理解隊列類型及其配置對于優化消息持久化和性能至關重要。 如果需要非持久化消息,應避免使用 stream 隊列,或仔細檢查其持久化相關配置。

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享