RabbitMQ
引言:RabbitMQ輕巧,易于在機(jī)房和云部署。 它支持多種消息傳遞協(xié)議。 RabbitMQ可以部署在分布式和聯(lián)合配置中,以滿足大規(guī)模,高可用性的要求。
上面引言中藏著的問題已經(jīng)很巨大了,但接下來先問一個(gè)問題“怎樣保證RabbitMQ的高可用??”
- 首先,RabbitMQ是主從模式的高可用的架構(gòu)。其次,它有三種部署模式:單機(jī)模式、普通群集模式、鏡像集群模式。
- 單機(jī)模式
? 單機(jī)模式是最基本的開發(fā)模式,也就是Demo模式,這當(dāng)然沒有高可用性。 -
普通集群模式
? 在多臺機(jī)器上都啟動(dòng)RabbitMQ的實(shí)例,順而組成一個(gè)主從集群。所以創(chuàng)建Queue,只存在其中一臺機(jī)器,每個(gè)實(shí)例同步 queue 的元數(shù)據(jù)(元數(shù)據(jù)可以認(rèn)為是 queue 的一些配置信息,通過元數(shù)據(jù),可以找到 queue 所在實(shí)例)。你消費(fèi)的時(shí)候,實(shí)際上如果連接到了另外一個(gè)實(shí)例,那么那個(gè)實(shí)例會從 queue 所在實(shí)例上拉取數(shù)據(jù)過來。
普通集群模式
? 這種方式確實(shí)很麻煩,也不怎么好,沒做到所謂的分布式,就是個(gè)普通集群。因?yàn)檫@導(dǎo)致你要么消費(fèi)者每次隨機(jī)連接一個(gè)實(shí)例然后拉取數(shù)據(jù),要么固定連接那個(gè) queue 所在實(shí)例消費(fèi)數(shù)據(jù),前者有數(shù)據(jù)拉取的開銷,后者導(dǎo)致單實(shí)例性能瓶頸。
? 而且如果那個(gè)放 queue 的實(shí)例宕機(jī)了,會導(dǎo)致接下來其他實(shí)例就無法從那個(gè)實(shí)例拉取,如果你開啟了消息持久化,讓 RabbitMQ 落地存儲消息的話,消息不一定會丟,得等這個(gè)實(shí)例恢復(fù)了,然后才可以繼續(xù)從這個(gè) queue 拉取數(shù)據(jù)。
? 所以這個(gè)事兒就比較尷尬了,這就沒有什么所謂的高可用性,這方案主要是提高吞吐量的,就是說讓集群中多個(gè)節(jié)點(diǎn)來服務(wù)某個(gè) queue 的讀寫操作。 - 鏡像集群模式
? 鏡像集群模式可以認(rèn)為是RabbitMQ 的高可用模式。跟普通集群模式不一樣的是,在鏡像集群模式下,你創(chuàng)建的 queue,無論元數(shù)據(jù)還是 queue 里的消息都會存在于多個(gè)實(shí)例上,就是說,每個(gè) RabbitMQ 節(jié)點(diǎn)都有這個(gè) queue 的一個(gè)完整鏡像,包含 queue 的全部數(shù)據(jù)的意思。然后每次你寫消息到 queue 的時(shí)候,都會自動(dòng)把消息同步到多個(gè)實(shí)例的 queue 上。
鏡像集群模式
? 在RabbitMQ 管理控制臺,新增一個(gè)策略,鏡像集群模式的策略,指定的時(shí)候是可以要求數(shù)據(jù)同步到所有節(jié)點(diǎn)的,也可以要求同步到指定數(shù)量的節(jié)點(diǎn),再次創(chuàng)建 queue 的時(shí)候,應(yīng)用這個(gè)策略,就會自動(dòng)將數(shù)據(jù)同步到其他的節(jié)點(diǎn)上去了。所以任何一個(gè)機(jī)器宕機(jī)了,其它機(jī)器(節(jié)點(diǎn))還包含了這個(gè) queue 的完整數(shù)據(jù),別的 consumer 都可以到其它節(jié)點(diǎn)上去消費(fèi)數(shù)據(jù)。
? 但是鏡像集群模式有缺點(diǎn)第一,性能開銷也太大,消息需要同步到所有機(jī)器上,導(dǎo)致網(wǎng)絡(luò)帶寬壓力和消耗很重!第二,這種模式不是分布式的,就沒有擴(kuò)展性可言了,如果某個(gè) queue 負(fù)載很重,就算加機(jī)器,新增的機(jī)器也包含了這個(gè) queue 的所有數(shù)據(jù),并沒有辦法線性擴(kuò)展你的 queue。


