本系列是「RabbitMQ實(shí)戰(zhàn):高效部署分布式消息隊(duì)列」書(shū)籍的總結(jié)筆記。
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括閬中網(wǎng)站建設(shè)、閬中網(wǎng)站制作、閬中網(wǎng)頁(yè)制作以及閬中網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,閬中網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到閬中省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!
上一篇介紹了各種場(chǎng)景下的最佳實(shí)踐,大部分場(chǎng)景可以使用「發(fā)后即忘」的模式,不需要響應(yīng),如果需要響應(yīng),可以使用RabbitMQ的RPC模型。
RabbitMQ以異步的方式解耦系統(tǒng)間的關(guān)系,調(diào)用者將業(yè)務(wù)請(qǐng)求發(fā)送到Rabbit服務(wù)器,就可以返回了,Rabbit會(huì)確保請(qǐng)求被正確處理,即使遇到網(wǎng)絡(luò)異常、Rabbit服務(wù)器崩潰、整個(gè)機(jī)房斷電等特殊場(chǎng)景,針對(duì)這些場(chǎng)景,Rabbit提供了各種機(jī)制確保其可用性。
本篇通過(guò)總結(jié)可能出現(xiàn)的特殊場(chǎng)景,對(duì)Rabbit提供的可用性保證進(jìn)行分析,學(xué)習(xí)它的實(shí)現(xiàn)方式,你會(huì)了解到:
在實(shí)際工作中,有很大一部分時(shí)間用在解決各種異常情況,比如針對(duì)用戶(hù)輸入的驗(yàn)證,JDK中提供的各種異常類(lèi),網(wǎng)絡(luò)異常等,這些相對(duì)來(lái)說(shuō)比較好解決。
Rabbit服務(wù)作為調(diào)用者和處理者的橋梁,至關(guān)重要,如果因?yàn)榫W(wǎng)絡(luò)異常、單臺(tái)服務(wù)器崩潰、機(jī)房癱瘓等原因?qū)е翿abbit服務(wù)不可用,會(huì)影響所有依賴(lài)的業(yè)務(wù)系統(tǒng)。
處理者和服務(wù)端是通過(guò)長(zhǎng)連接交互的,這樣可以將消息實(shí)時(shí)推送,網(wǎng)絡(luò)異常可能會(huì)導(dǎo)致長(zhǎng)連接斷開(kāi),如果客戶(hù)端無(wú)法感知,處理者將接收不到任何消息,這種情況稱(chēng)為「連接丟失」。
通過(guò)捕獲連接異常,進(jìn)行重連,可以解決這種問(wèn)題,另外,Rabbit客戶(hù)端進(jìn)行了封裝,很容易處理這種問(wèn)題。
如果只有一臺(tái)服務(wù)器服務(wù),服務(wù)器崩潰將導(dǎo)致服務(wù)不可用,一般會(huì)使用集群將多個(gè)服務(wù)器看成一個(gè)整體對(duì)外提供服務(wù),這樣,單臺(tái)服務(wù)器崩潰不會(huì)影響整體的服務(wù)。
使用集群后,就要考慮一些問(wèn)題:
如果考慮機(jī)房癱瘓,就要建多個(gè)數(shù)據(jù)中心,RabbitMQ提供了一種機(jī)制,可以方便地在不同數(shù)據(jù)中心的Rabbit間復(fù)制消息。
RabbitMQ最優(yōu)秀的功能之一就是其內(nèi)建集群,主要用于完成2個(gè)目標(biāo):
RabbitMQ會(huì)始終記錄四種類(lèi)型的內(nèi)部元數(shù)據(jù)(類(lèi)似索引):
當(dāng)引入集群時(shí),就需要追蹤新的元數(shù)據(jù)類(lèi)型:集群節(jié)點(diǎn)位置,以及節(jié)點(diǎn)與已記錄的其他類(lèi)型元數(shù)據(jù)的關(guān)系。
不是每個(gè)節(jié)點(diǎn)都有所有隊(duì)列的完全拷貝,如果在集群中創(chuàng)建隊(duì)列,只會(huì)在單個(gè)節(jié)點(diǎn)上創(chuàng)建完整的隊(duì)列信息(元數(shù)據(jù)、狀態(tài)、內(nèi)容),所有其他節(jié)點(diǎn)只知道隊(duì)列的元數(shù)據(jù)和指向該隊(duì)列的節(jié)點(diǎn)指針。
如果節(jié)點(diǎn)崩潰了,附加在隊(duì)列上的消費(fèi)者也就無(wú)法接收新的消息了。可以讓消費(fèi)者重連到集群并重新創(chuàng)建隊(duì)列,這種做法僅當(dāng)隊(duì)列沒(méi)設(shè)置持久化時(shí)才可行,這是為了確保當(dāng)失敗的節(jié)點(diǎn)恢復(fù)后加入集群,節(jié)點(diǎn)上的隊(duì)列消息不會(huì)丟失。
為什么不將隊(duì)列內(nèi)容和狀態(tài)復(fù)制到所有節(jié)點(diǎn):第一,存儲(chǔ)空間,如果每個(gè)集群節(jié)點(diǎn)都擁有所有隊(duì)列的完全拷貝,添加新節(jié)點(diǎn)不會(huì)帶來(lái)更多存儲(chǔ)空間;第二,性能,消息的發(fā)布者需要將消息復(fù)制到每一個(gè)集群節(jié)點(diǎn),對(duì)于持久化消息,網(wǎng)絡(luò)和磁盤(pán)復(fù)制都會(huì)增加。
而交換器只是一張查詢(xún)表,而非實(shí)際的消息路由器,因此將交換器在整個(gè)集群中進(jìn)行復(fù)制會(huì)更加簡(jiǎn)單
可以把每個(gè)隊(duì)列想象成節(jié)點(diǎn)上運(yùn)行的進(jìn)程,每個(gè)進(jìn)程擁有自己的進(jìn)程ID,交換器只是路由模式列表和匹配消息應(yīng)發(fā)往的隊(duì)列進(jìn)程ID列表。
每個(gè)Rabbit節(jié)點(diǎn),要么是內(nèi)存節(jié)點(diǎn),要么是磁盤(pán)節(jié)點(diǎn),單節(jié)點(diǎn)系統(tǒng)只運(yùn)行磁盤(pán)類(lèi)型的節(jié)點(diǎn),在集群中,可以選擇配置部分節(jié)點(diǎn)為內(nèi)存節(jié)點(diǎn)。
在集群中聲明隊(duì)列、交換器或綁定的時(shí)候,這些操作直到所有集群節(jié)點(diǎn)都成功提交元數(shù)據(jù)變更后才返回。
RabbitMQ只要求集群中至少有一個(gè)磁盤(pán)節(jié)點(diǎn),如果只有一個(gè)磁盤(pán)節(jié)點(diǎn),剛好又崩潰了,集群可以繼續(xù)路由消息,但不能創(chuàng)建隊(duì)列、交換器、綁定、添加用戶(hù)、更改權(quán)限等操作。所以,建議設(shè)置兩個(gè)磁盤(pán)節(jié)點(diǎn),當(dāng)內(nèi)存節(jié)點(diǎn)重啟后,會(huì)連接到預(yù)先配置的磁盤(pán)節(jié)點(diǎn),下載當(dāng)前集群元數(shù)據(jù)拷貝,所以要將所有磁盤(pán)節(jié)點(diǎn)告訴內(nèi)存節(jié)點(diǎn)。
前面提到,隊(duì)列只會(huì)在集群中的一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)崩潰后,隊(duì)列消息就會(huì)丟失,RabbitMQ2.6版本之后,提供了鏡像隊(duì)列,一旦主隊(duì)列不可用,從隊(duì)列將被選舉為新的主隊(duì)列。
對(duì)于鏡像隊(duì)列,除了將消息按照路由綁定規(guī)則投遞到合適的隊(duì)列,也會(huì)將消息投遞到鏡像隊(duì)列的從拷貝。
對(duì)于發(fā)送方確認(rèn)消息,Rabbit會(huì)在所有隊(duì)列和隊(duì)列的從拷貝安全地接收到消息時(shí),才會(huì)通知發(fā)送方。
另外,使用鏡像隊(duì)列時(shí),有一個(gè)問(wèn)題:如果主拷貝節(jié)點(diǎn)發(fā)送故障,從隊(duì)列會(huì)選舉Wie主隊(duì)列,所有該隊(duì)列的消費(fèi)者需要重新附加并監(jiān)聽(tīng)新的隊(duì)列主拷貝。對(duì)于通過(guò)故障節(jié)點(diǎn)進(jìn)行連接的消費(fèi)者,可以通過(guò)丟失到節(jié)點(diǎn)的TCP連接檢測(cè)到,但對(duì)于那些通過(guò)節(jié)點(diǎn)附加到鏡像隊(duì)列且正常運(yùn)行的消費(fèi)者將無(wú)法檢測(cè)到。
Rabbit通過(guò)給消費(fèi)者發(fā)送一個(gè)消費(fèi)者取消通知,告知不再附加在隊(duì)列主拷貝了,需要重新連接。
這一小節(jié)主要討論消費(fèi)者如何檢測(cè)連接丟失,并進(jìn)行重連操作。
處理到集群的重連有多重策略,比較好的一種方式是使用負(fù)載均衡,不僅可以減少應(yīng)用程序處理節(jié)點(diǎn)故障代碼的復(fù)雜性,又能確保在集群中連接的平均分配。
關(guān)于負(fù)載均衡,網(wǎng)上介紹的比較多了,這里就不再過(guò)多介紹了,主要看看如何感知故障,并進(jìn)行重連操作。
感知故障比較簡(jiǎn)單,當(dāng)長(zhǎng)連接斷開(kāi)時(shí),會(huì)拋出異常,捕獲對(duì)應(yīng)的異常即可。
當(dāng)集群節(jié)點(diǎn)出現(xiàn)故障時(shí),應(yīng)用程序需要考慮:下一個(gè)該連向哪里?這個(gè)工作已經(jīng)交由負(fù)載均衡器決定。
關(guān)于重連處理,要考慮:
當(dāng)對(duì)可用性要求特別高時(shí),不允許消息丟失,需要將隊(duì)列、交換器、消息設(shè)置成持久化,如果一個(gè)節(jié)點(diǎn)崩潰了,在恢復(fù)之前,將無(wú)法轉(zhuǎn)發(fā)消息,因?yàn)槟J(rèn)的群集架構(gòu)不允許在集群其他節(jié)點(diǎn)創(chuàng)建隊(duì)列,防止故障節(jié)點(diǎn)恢復(fù)后,歷史消息丟失。
可以通過(guò)構(gòu)建主/備機(jī)的獨(dú)立RabbitMQ,也就是warren模式,解決這個(gè)問(wèn)題。一個(gè)warren是指一對(duì)主/備獨(dú)立服務(wù)器,并前置一套負(fù)載均衡器來(lái)處理故障轉(zhuǎn)移。
主服務(wù)器和備用服務(wù)器之間沒(méi)有協(xié)作,只有當(dāng)主服務(wù)器崩潰時(shí),備用服務(wù)器才會(huì)處理消息。可以保證,主節(jié)點(diǎn)故障后,通過(guò)備用節(jié)點(diǎn)重新創(chuàng)建隊(duì)列、交換器繼續(xù)服務(wù),故障節(jié)點(diǎn)恢復(fù)后,可以繼續(xù)消費(fèi)主節(jié)點(diǎn)未消費(fèi)的消息。
在只有一個(gè)數(shù)據(jù)中心的時(shí)候,RabbitMQ集群對(duì)于提升消息通信性能來(lái)說(shuō)是很棒的方案,但需要把消息從一個(gè)程序路由到另一個(gè)城市的時(shí)候,就比較麻煩了,可以通過(guò)Shovel解決。
Shovel是RabbitMQ的一個(gè)插件,可以使你能夠定義RabbitMQ上的隊(duì)列和另一個(gè)RabbitMQ上的交換器之間的復(fù)制關(guān)系。說(shuō)白了就是生產(chǎn)者和消費(fèi)者離得比較遠(yuǎn)。
通過(guò)在機(jī)房1創(chuàng)建一個(gè)新的隊(duì)列,用于接收網(wǎng)站發(fā)布的消息,然后讓shovel消費(fèi)這些消息并重新將消息通過(guò)WAN連接發(fā)布到機(jī)房2上的交換器。
這樣對(duì)于用戶(hù)來(lái)說(shuō),只要發(fā)布到機(jī)房1的隊(duì)列即可返回,減少了響應(yīng)時(shí)間。機(jī)房1可以持續(xù)將消息發(fā)布到機(jī)房2上。
通過(guò)上面的介紹可以看到,保證高可用需要做很多工作,可以根據(jù)業(yè)務(wù)對(duì)可用性的要求,選擇不同的架構(gòu)方式。
下一篇重點(diǎn)介紹RabbitMQ管理界面和監(jiān)控。
歡迎掃描下方二維碼,關(guān)注我的個(gè)人微信公眾號(hào) ~
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
分享名稱(chēng):RabbitMQ實(shí)戰(zhàn):可用性分析和實(shí)現(xiàn)-創(chuàng)新互聯(lián)
文章起源:http://www.chinadenli.net/article8/dcsjop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷(xiāo)、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、云服務(wù)器、Google、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容