RabbitMQ的集群模式有兩種:
普通模式:消息實體在其中一個節點上,消費時同步
默認模式,以兩個節點(rabbit01、rabbit02)為例來進行說明。
對於Queue來說,消息實體只存在於其中一個節點rabbit01(或者rabbit02),rabbit01和rabbit02兩個節點僅有相同的元數據,即隊列的結構。
當消息進入rabbit01節點的Queue后,consumer從rabbit02節點消費時,RabbitMQ會臨時在rabbit01、rabbit02間進行消息傳輸,把A中的消息實體取出並經過B發送給consumer。
所以consumer應盡量連接每一個節點,從中取消息。即對於同一個邏輯隊列,要在多個節點建立物理Queue。否則無論consumer連rabbit01或rabbit02,出口總在rabbit01,會產生瓶頸。
當rabbit01節點故障后,rabbit02節點無法取到rabbit01節點中還未消費的消息實體。如果做了消息持久化,那么得等rabbit01節點恢復,然后才可被消費;如果沒有持久化的話,就會產生消息丟失的現象。
鏡像模式:消息實體會同步到所有節點上
把需要的隊列做成鏡像隊列,存在與多個節點屬於RabbitMQ的HA方案。
該模式解決了普通模式中的問題,其實質和普通模式不同之處在於,消息實體會主動在鏡像節點間同步,而不是在客戶端取數據時臨時拉取。
該模式帶來的副作用也很明顯,除了降低系統性能外,如果鏡像隊列數量過多,加之大量的消息進入,集群內部的網絡帶寬將會被這種同步通訊大大消耗掉。
所以在對可靠性要求較高的場合中適用。