在消息隊列 RabbitMQ 入門介紹裏,描述了 RabbitMQ 的持久性設置。在設置持久化後,消息保存在磁盤上,即便 RabbitMQ 重啓或服務器重啓,消息都不會丟失。 緩存
RabbitMQ 支持消息的持久化,也就是數據寫在磁盤上,爲了數據安全考慮,我想大多數用戶都會選擇持久化。消息隊列持久化包括3個部分:
(1)exchange 持久化,在聲明時指定 durable => 1
(2)queue 持久化,在聲明時指定 durable => 1
(3)消息持久化,在投遞時指定 delivery_mode => 2(1 是非持久化) 安全若是 exchange 和 queue 都是持久化的,那麼它們之間的 binding 也是持久化的。若是exchange 和 queue 二者之間有一個持久化,一個非持久化,就不容許創建綁定(這句話說的有問題,實際狀況中常常出現非持久化的 queue 綁定到持久化 exchange 上的狀況。我的以爲其意思應該是:當二者並不是都是持久化時,其對應的 binding 就沒法獲得恢復)。 服務器
可是,即便設置了持久化,也不能百分百保證消息不會丟失。有很小的機率在 RabbitMQ 接受到消息後,還沒來得及寫到磁盤,就發生重啓了。另外,RabbitMQ 也不會對每個消息執行 fsync(2),消息可能僅僅寫入到緩存,還沒來得及 flush 到硬件存儲。所以 RabbitMQ 的持久性設置並不是足夠安全,對於普通的工做隊列也許夠用了。若是須要增強的安全保證,能夠把發佈消息的代碼封裝在事務裏。
spa