RabbitMQ的高可用
RabbitMQ是基於主從做高可用的,RabbitMQ有三種模式:單機模式,普通集羣模式,鏡像集羣模式。
-
單機模式
一般用在本地,不會用在生產環境。 -
普通集羣模式
在多臺機器上啓動多個RabbitMQ實例,每個機器啓動一個,但是你創建的queue只會放在一個RabbitMQ實例上,每個實例都同步queue的元數據。消費者消費的時候,如果連接到了另外一個實例,那麼這個實例會從queue所在實例上拉取數據過來,這種模式不是分佈式,就是個普通集羣。因爲這導致你要麼消費者每次隨機連接一個實例然後拉取數據,要麼固定連接那個queue所在實例,前者有數據拉取的開銷,後者存在單實例性能瓶頸。而且那個queue所在實例宕機了,會導致其他實例無法拉取數據,如果開啓了消息持久化,讓RabbitMQ落地存儲消息的話,得等到這個實例恢復了,纔可以繼續從這個實例拉取數據。這樣也就沒有什麼高可用而言了,這種方案主要是提高吞吐量的,就是說讓集羣中多個節點來服務某個queue的讀寫操作。 -
鏡像集羣模式
RabbitMQ真正的高可用模式,你創建的queue的元數據和消息都會存儲在多個實例上,每次寫消息到queue的時候,都會自動把消息同步到多個實例queue裏。這樣的話如果有一個實例不可用,還有其他的實例可用。但是性能開銷太大,消息同步所有機器,導致網絡帶寬壓力和消耗很大。同時就也沒有什麼擴展性了,如果某個queue負載很重,即使加機器,新增的機器也包含了這個queue的所有數據,並沒有辦法線性擴展queue。不是分佈式的。