關於MQ的幾件小事(二)如何保證訊息佇列的高可用

2021-09-23 10:45:48 字數 2343 閱讀 6320

rabbitmq基於主從模式實現高可用。rabbitmq有三種模式:單機模式,普通集群模式,映象集群模式。

(1)單機模式:

單機模式就是demo級別的,生產中不會有人使用。

(2)普通集群模式

普通集群模式就是在多台機器上啟動多個rabbitmq例項,每個機器啟動乙個。但是建立的queue只會放在乙個rabbitmq例項上面,但是其他的例項都同步了這個queue的元資料。在你消費的時候,如果連線到了另乙個例項,他會從擁有queue的那個例項獲取訊息然後再返回給你。

這種方式並沒有做到所謂訊息的高可用,就是個普通的集群,這樣還會導致要麼消費者每次隨機連線乙個例項然後拉取資料,這樣的話在例項之間會產生網路傳輸,增加系統開銷,要麼固定連線那個queue所在的例項消費,這樣會導致單例項的效能瓶頸。

而且如果那個方queue的例項宕機了,會導致接下來其他例項都無法拉取資料;如果沒有開啟訊息的持久化會丟失訊息;就算開啟了訊息的持久化,訊息不一定會丟,但是也要等這個例項恢復了,才可以繼續拉取資料。

所以這個並沒有提供高可用,這種方案只是提高了吞吐量,也就是讓集群中多個節點來服務某個queue的讀寫操作。

(3)映象集群模式

這種模式,才是rabbitmq提供是真正的高可用模式,跟普通集群不一樣的是,你建立的queue,無論元資料還是queue裡面是訊息資料都存在多個例項當中,然後每次寫訊息到queue的時候,都會自動把訊息到多個queue裡進行訊息同步。

這種模式的好處在於,任何一台機器宕機了,其他的機器還可以使用。

壞處在於:1、效能消耗太大,所有機器都要進行訊息的同步,導致網路壓力和消耗很大。2、沒有擴充套件性可言,如果有乙個queue負載很重,就算加了機器,新增的機器還是包含了這個queue的所有資料,並沒有辦法擴充套件queue。

如何開啟映象集群模式:在控制台新增乙個映象集群模式的策略,指定的時候可以要求資料同步到所有節點,也可以要求同步到指定節點,然後在建立queue的時候,應用這個策略,就會自動將資料同步到其他的節點上面去了。

(1)kafka的乙個基本架構:多個broker組成,乙個broker是乙個節點;你建立乙個topic,這個topic可以劃分成多個partition,每個partition可以存在於不同的broker上面,每個partition存放一部分資料。這是天然的分布式訊息佇列。

實際上rabbitmq並不是分布式訊息佇列,他就是傳統的訊息佇列,只不過提供了一些集群、ha的機制而已,因為無論如何配置,rabbitmq乙個queue的資料就存放在乙個節點裡面,映象集群下,也是每個節點都放這個queue的全部資料。

kafka在0.8以前是沒有ha機制的,也就是說任何乙個broker宕機了,那個broker上的partition就丟了,沒法讀也沒法寫,沒有什麼高可用可言。

kafka在0.8之後,提過了ha機制,也就是replica副本機制。每個partition的資料都會同步到其他機器上,形成自己的replica副本。然後所有的replica副本會選舉乙個leader出來,那麼生產者消費者都和這個leader打交道,其他的replica就是follower。寫的時候,leader會把資料同步到所有follower上面去,讀的時候直接從leader上面讀取即可。

為什麼只能讀寫leader:因為要是你可以隨意去讀寫每個follower,那麼就要關心資料一致性問題,系統複雜度太高,容易出問題。kafka會均勻度講乙個partition的所有資料replica分布在不同的機器上,這樣就可以提高容錯性。

這樣就是高可用了,因為如果某個broker宕機 了,沒事兒,那個broker的partition在其他機器上有副本,如果這上面有某個partition的leader,那麼此時會重新選舉出乙個現代leader出來,繼續讀寫這個新的leader即可。

寫訊息:寫資料的時候,生產者就寫leader,然後leader將資料落到磁碟上之後,接著其他follower自己主動從leader來pull資料。一旦所有follower同步好了資料,就會傳送ack個leader,leader收到了所有的follower的ack之後,就會返回寫成功的訊息給訊息生產者。(這只是一種模式,可以調整)。

讀資料:消費資料的時候,只會從leader進行消費。但是只有乙個訊息已經被所有follower都同步成功返回ack的時候,這個訊息才會被消費者讀到。

關於MQ的幾件小事(三)如何保證訊息不重複消費

冪等 idempotent idempotence 是乙個數學與計算機學概念,常見於抽象代數中。在程式設計中乙個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函式,或冪等方法,是指可以使用相同引數重複執行,並能獲得相同結果的函式。這些函式不會影響系統狀態,也不用擔心重複執行會...

關於MQ的幾件小事(三)如何保證訊息不重複消費

冪等 idempotent idempotence 是乙個數學與計算機學概念,常見於抽象代數中。在程式設計中乙個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函式,或冪等方法,是指可以使用相同引數重複執行,並能獲得相同結果的函式。這些函式不會影響系統狀態,也不用擔心重複執行會...

關於MQ的幾件小事(三)如何保證訊息不重複消費

冪等 idempotent idempotence 是乙個數學與計算機學概念,常見於抽象代數中。在程式設計中乙個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函式,或冪等方法,是指可以使用相同引數重複執行,並能獲得相同結果的函式。這些函式不會影響系統狀態,也不用擔心重複執行會...