消息中間件:談一談 RabbitMQ 的持久化機制

消息中間件,又叫MQ,這幾年逐漸火爆起來,尤其擅長處理異構系統間的消息傳遞和對突發流量的削峰限流,而RabbitMQ是其中最典型的代表。

消息中間件:談一談 RabbitMQ 的持久化機制

一、RabbitMQ 簡介

RabbitMQ是一個開源的AMQP實現,服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Java、C、PHP等,支持AJAX。可用於在分佈式系統中存儲轉發消息,RabbitMQ有如下特點,

  • 可靠性,使用一些機制來保證可靠性,如持久化、傳輸確認、發佈確認。
  • 靈活的路由,在消息進入隊列之前,通過 Exchange 來路由消息的。
  • 消息集群,多個服務器可以組成一個集群,形成一個邏輯 Broker 。
  • 高可用,隊列可以在集群中的機器上進行鏡像,在部分節點出問題的情況下隊列仍然可用。
  • 多協議,支持多種消息隊列協議,比如 STOMP、MQTT 等。
消息中間件:談一談 RabbitMQ 的持久化機制

二、RabbitMQ 持久化機制

RabbitMQ的持久化主要是為了防止消息丟失,主要分兩類持久化,

  • 交換機、隊列持久化:持久化交換機和隊列,設置交換機和隊列的durable屬性為ture。
  • 消息持久化:持久化消息本身,設置消息的“投遞模式”屬性設置為 2 (delivery_mode=2)。
消息中間件:談一談 RabbitMQ 的持久化機制

RabbitMQ 會把持久化的數據寫入磁盤上的一個持久化日誌文件,在做數據恢復時,從磁盤讀取持久化的數據重建。當發佈一條持久化的消息到持久化的交換機上時,RabbitMQ 會在消息提交到日誌文件後才發送響應。如果RabbitMQ重啟,服務器會自動重建交換機和隊列,重播持久性日誌文件中的消息到合適的隊列或者交換機上。

三、對 RabbitMQ 持久化機制的幾點看法

有時候因斷電等原因,重啟RabbitMQ後,隊列和交換器都會丟失(隨同裡面的消息)。而RabbitMQ的消息持久化,極大的避免了這種情況的發生,給我們了一個很好的選擇。

消息中間件:談一談 RabbitMQ 的持久化機制

但是有利就有弊,這裡我主要談下缺點:

首先,消息持久化對RabbitMQ的性能有較大影響,寫入磁盤要比寫入內存慢很多,而且會極大的減少RabbitMQ服務器每秒可處理的消息總數,導致消息吞度量降低至少10倍的情況並不少見。

其次,持久化消息在RabbitMQ內建集群環境中工作的並不好,實際上集群上的隊列均勻分佈在各個節點上而且沒有冗餘,如果運行a隊列的節點崩潰了,那麼直到節點恢復前,這個隊列就從整個集群消失了,而且這個節點上的所有隊列不可用,而且持久化隊列也無法重建。

消息中間件:談一談 RabbitMQ 的持久化機制

最後要注意一點,如果原交換器或者隊列是非持久的,一定要刪除後才可重新創建持久化或者也可以創建其他名稱的交換器或者隊列。


分享到:


相關文章: