持久化的消息和非持久化的消息均可以被寫入到磁盤。
持久化的消息一開始就會寫入磁盤,若是能夠,也會在內存中保存一部分以提升性能,當內存吃緊時會從內存中清楚。
非持久化的消息通常存儲在內存中,內存吃緊時會換入到磁盤中,以節省內存空間。
這兩種類型的消息的落盤處理都在RabbitMQ的」持久層「完成。算法
持久層是一個邏輯概念,包含隊列索引和消息存儲。性能
消息能夠存儲在rabbit_queue_index中,也能夠存儲在在rabbit_msg_store中。最佳的配備是較小的消息存儲在 rabbit queue index 中而較大的消息存儲在rabbit_msg_store 中。索引
隊列一般由rabbit_amqqueue_process和backing_queue兩部分組成隊列
儘量地將消息存入磁盤中,在消費者消費到相應消息時才被加載到內存中。進程
內存或者磁盤低於配置的閾值時,RabbitMQ會暫時阻塞客戶端的鏈接直至恢復正常。blocking:對應消費者關聯的connection,這時候並不阻塞。blocked:對應發送消息的Connection,這時候阻塞。內存
RabbitMQ從2.8版本之後還引入了流控來保證系統的穩定性。內存和磁盤告警至關於全局流控,一旦觸發會阻塞集羣中全部Connection,本流控是針對單個Connection的。
RabbitMQ 使用了一種基於信用證算法 (credit-based algorithm) 的流控機制來限制發送消息的速率以解決前面所提出的問題。
流控做用於Connection,出現郵件飽和時會阻塞。流控做用於Channel,出現性能瓶頸時會阻塞。it
綜上,瓶頸每每發生在rabbit_amqqueue_process 中,用多個rabbit_amqqueue_process代替單個rabbit_amqqueue_process,能夠充分利用上被流控的性能(聲明交換器、隊列、綁定關係;封裝消費者;封裝生產者)。io
避免單點問題,集羣中某個節點崩潰,雖然交換器和綁定關係還能保存,隊列和其上存儲的消息卻不能倖免於難,這是由於隊列進程及其內容僅僅維持在
單個節點之上,因此一個節點的失效表現爲其對應的隊列不可用。
引入鏡像隊列的機制,能夠將隊列鏡像到集羣中的其餘 Broker 節點之上,若是集羣中的一個節點失效了,隊列能自動地切換到鏡像中的另外一個節點上以保證服務的可用性。集羣