為什么在 RabbitMQ 中設置 delivery_mode 為 1 時消息仍會被寫入磁盤?

為什么在 RabbitMQ 中設置 delivery_mode 為 1 時消息仍會被寫入磁盤?

rabbitmq 消息持久化設置失效的疑難排查

在 RabbitMQ 中,delivery_mode 屬性控制消息持久化方式。設置為 1 表示消息僅存儲在內存中,但實際應用中,即使設置了 delivery_mode: 1,消息有時仍會被寫入磁盤,導致性能下降。

本文分析一個案例:用戶發現即使設置 delivery_mode: 1,消息投遞速度仍然很慢,并且內存中消息數量(In memory)與持久化消息數量(Persistent)相等。這與預期不符,因為非持久化消息不應該寫入磁盤。

用戶已確認消息的 delivery_mode 正確設置,排除了代碼問題??紤]到該隊列由 kubernetes 管理員部署,用戶懷疑是服務器配置問題。在 docker 環境下測試,問題未重現,進一步佐證了此猜測。

用戶提出了兩種可能:

  1. 服務器內存不足。
  2. RabbitMQ 啟用了某些特殊特性。

關鍵觀察:無論 delivery_mode 為 1 或 2,In memory 和 Persistent 值始終相等。

社區成員給出了一個合理的解釋:啟用 Stream 隊列。Stream 隊列是 RabbitMQ 的一種特殊隊列類型,默認啟用持久化,即使 delivery_mode 設置為 1,消息也會寫入磁盤。

因此,如果遇到類似問題,請檢查是否使用了 Stream 隊列。如果是,則需要調整相關配置,例如禁用 Stream 隊列的持久化或使用普通隊列,以確保消息處理符合預期。 這將有助于提升消息投遞速度,避免因非預期持久化導致的性能瓶頸。

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