rabbitmq:delivery_mode=1 消息為何仍寫入磁盤?
使用 RabbitMQ 時,設置 delivery_mode: 1 理應避免消息寫入磁盤,因為它表示非持久化消息。然而,實際情況中,即使設置了 delivery_mode: 1,消息發送速度仍然緩慢,RabbitMQ 管理界面顯示消息同時存在于內存和磁盤中。
問題現象
使用 delivery_mode: 1 發送消息,速度卻與 delivery_mode: 2 (持久化消息) 一樣慢。監控面板顯示 “內存中” 和 “持久化” 消息數量相同,這與預期不符。已確認消息確實設置了 delivery_mode: 1,但仍然寫入磁盤。
問題根源分析
問題可能與 RabbitMQ 的配置或運行環境有關。文章提到,在 kubernetes 環境中部署的隊列出現此問題,而本地 docker 環境則沒有。
可能的因素:
- 內存不足:可能性較低,因為沒有明顯的內存告警。
- 啟用特定特性:某些 RabbitMQ 特性可能導致此問題。
進一步觀察發現,隊列類型為 classic,無論 delivery_mode 設置為何值,”內存中” 和 “持久化” 消息數量總是相等。
解決方案
最終,問題在于 使用了 stream 隊列。stream 隊列可能默認啟用持久化,即使 delivery_mode: 1,消息也會寫入磁盤。
因此,遇到類似問題時,務必檢查是否使用了 stream 隊列。 理解隊列類型及其配置對于優化消息持久化和性能至關重要。 如果需要非持久化消息,應避免使用 stream 隊列,或仔細檢查其持久化相關配置。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END