日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MQ如何保证高可用

發(fā)布時間:2023/12/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MQ如何保证高可用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

上一篇我們通過介紹MQ的基本功能簡單的分析了項目中MQ的選型,那么當(dāng)我們項目中真正使用MQ的時候,必然會涉及到如何保證MQ的高可用,畢竟如果MQ宕機(jī),可能會造成整個調(diào)用鏈路的失敗,因此接下來我們簡單聊聊MQ的高可用問題。

那么如何保證消息隊列的高可用呢?

由于MQ中間件的類型比較多,因此我們依次對常用的RabbitMq和Kafka進(jìn)行高可用的剖析。

(1)RabbitMQ的高可用性

RabbitMQ是比較有代表性的,因為是基于主從做高可用性的。

rabbitmq有三種模式:單機(jī)模式,普通集群模式,鏡像集群模式

1)單機(jī)模式

就是本地級別的,一般就是測試環(huán)境用用,生產(chǎn)環(huán)境一般不會用到。

2)普通集群模式

意思就是在多臺機(jī)器上啟動多個rabbitmq實例,每個機(jī)器啟動一個。但是你創(chuàng)建的queue,只會放在一個rabbtimq實例上,但是每個實例都同步queue的元數(shù)據(jù)。完了你消費(fèi)的時候,實際上如果連接到了另外一個實例,那么那個實例會從queue所在實例上拉取數(shù)據(jù)過來。

這種方式比較麻煩,不怎么好,并不是所謂的分布式,就是個普通集群。因為這導(dǎo)致你要么消費(fèi)者每次隨機(jī)連接一個實例然后拉取數(shù)據(jù),要么固定連接那個queue所在實例消費(fèi)數(shù)據(jù),前者有數(shù)據(jù)拉取的開銷,后者導(dǎo)致單實例性能瓶頸。

而且如果那個放queue的實例宕機(jī)了,會導(dǎo)致接下來其他實例就無法從那個實例拉取,如果你開啟了消息持久化,讓rabbitmq落地存儲消息的話,消息不一定會丟,得等這個實例恢復(fù)了,然后才可以繼續(xù)從這個queue拉取數(shù)據(jù)。

所以嚴(yán)格從理論上來說,這種模式并沒有實現(xiàn)所謂的高可用,僅僅是提高吞吐量的,就是說讓集群中多個節(jié)點來服務(wù)某個queue的讀寫操作。

3)鏡像集群模式

這種模式,才算得上是rabbitmq的高可用模式,跟普通集群模式不一樣的是,你創(chuàng)建的queue,無論元數(shù)據(jù)還是queue里的消息都會存在于多個實例上,然后每次你寫消息到queue的時候,都會自動把消息到多個實例的queue里進(jìn)行消息同步。

這樣的話,好處在于,你任何一個機(jī)器宕機(jī)了,沒事兒,別的機(jī)器都可以用。壞處在于,第一,這個性能開銷也太大了,消息同步所有機(jī)器,導(dǎo)致網(wǎng)絡(luò)帶寬壓力和消耗很重!第二,這樣的話,就沒有擴(kuò)展性可言了,因為這并不是所謂的分布式架構(gòu),如果某個queue負(fù)載很重,你加機(jī)器,新增的機(jī)器也包含了這個queue的所有數(shù)據(jù),并沒有辦法線性擴(kuò)展你的queue。

至于怎么開啟這個鏡像集群模式呢?我這里簡單說一下,就是在rabbitmq的管理控制臺,新增一個策略,這個策略是鏡像集群模式的策略,指定的時候可以要求數(shù)據(jù)同步到所有節(jié)點的,也可以要求就同步到指定數(shù)量的節(jié)點,然后你再次創(chuàng)建queue的時候,應(yīng)用這個策略,就會自動將數(shù)據(jù)同步到其他的節(jié)點上去了。

?

(2)kafka的高可用性

kafka一個最基本的架構(gòu)認(rèn)識:多個broker組成,每個broker是一個節(jié)點;你創(chuàng)建一個topic,這個topic可以劃分為多個partition,每個partition可以存在于不同的broker上,每個partition就放一部分?jǐn)?shù)據(jù)。

這就是天然的分布式消息隊列,就是說一個topic的數(shù)據(jù),是分散放在多個機(jī)器上的,每個機(jī)器就放一部分?jǐn)?shù)據(jù)。

實際上rabbitmq之類的,并不是分布式消息隊列,他就是傳統(tǒng)的消息隊列,只不過提供了一些集群、HA的機(jī)制而已,因為無論怎么玩兒,rabbitmq一個queue的數(shù)據(jù)都是放在一個節(jié)點里的,鏡像集群下,也是每個節(jié)點都放這個queue的完整數(shù)據(jù)。

kafka 0.8以前,是沒有HA機(jī)制的,就是任何一個broker宕機(jī)了,那個broker上的partition就廢了,沒法寫也沒法讀,沒有什么高可用性可言。

kafka 0.8以后,提供了HA機(jī)制,就是replica副本機(jī)制。每個partition的數(shù)據(jù)都會同步到其他機(jī)器上,形成自己的多個replica副本。然后所有replica會選舉一個leader出來,那么生產(chǎn)和消費(fèi)都跟這個leader打交道,然后其他replica就是follower。寫的時候,leader會負(fù)責(zé)把數(shù)據(jù)同步到所有follower上去,讀的時候就直接讀leader上數(shù)據(jù)即可。只能讀寫leader?很簡單,要是你可以隨意讀寫每個follower,那么就要care數(shù)據(jù)一致性的問題,系統(tǒng)復(fù)雜度太高,很容易出問題。kafka會均勻的將一個partition的所有replica分布在不同的機(jī)器上,這樣才可以提高容錯性。

這么搞,就有所謂的高可用性了,因為如果某個broker宕機(jī)了,沒事兒,那個broker上面的partition在其他機(jī)器上都有副本的,如果這上面有某個partition的leader,那么此時會重新選舉一個新的leader出來,大家繼續(xù)讀寫那個新的leader即可。這就有所謂的高可用性了。

寫數(shù)據(jù)的時候,生產(chǎn)者就寫leader,然后leader將數(shù)據(jù)落地寫本地磁盤,接著其他follower自己主動從leader來pull數(shù)據(jù)。一旦所有follower同步好數(shù)據(jù)了,就會發(fā)送ack給leader,leader收到所有follower的ack之后,就會返回寫成功的消息給生產(chǎn)者。(當(dāng)然,這只是其中一種模式,還可以適當(dāng)調(diào)整這個行為)

消費(fèi)的時候,只會從leader去讀,但是只有一個消息已經(jīng)被所有follower都同步成功返回ack的時候,這個消息才會被消費(fèi)者讀到。

以上就是kafka保證高可用的機(jī)制了。

?

tips:

最后簡單提一點關(guān)于kafka高性能的原因:

1.磁盤順序?qū)?寫磁盤為順序追加寫,consumer通過offset消費(fèi))

2.零拷貝(減少用戶中間層緩存)

3.分區(qū)partition,并行處理

4.批量發(fā)送消息

5.數(shù)據(jù)壓縮(gzip)

更細(xì)節(jié)的原因后續(xù)會整理成文章發(fā)出,請持續(xù)關(guān)注公眾號“蝦米聊吧

參考:石杉筆記

?

關(guān)注微信公眾號“蝦米聊吧”,后續(xù)持續(xù)放送“技術(shù)架構(gòu)”干貨!!!

? ?一個熱衷于分享技術(shù)和生活的程序猿,讓我們一起交流吧~??????

?? ? ? ? ? ?? ? ?

? ? ? ? ? ? ? ? 微信掃描二維碼,關(guān)注我的公眾號

?

總結(jié)

以上是生活随笔為你收集整理的MQ如何保证高可用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。