學(xué)AI,好工作 就找北大青鳥(niǎo)
關(guān)注小青 聽(tīng)課做題,輕松學(xué)習(xí)
周一至周日
4000-9696-28

收藏!分布式消息隊(duì)列的避坑指南!

來(lái)源:北大青鳥(niǎo)總部 2023年05月31日 15:06

摘要: 當(dāng)消息隊(duì)列遇上分布式,就變成了分布式消息隊(duì)列,也就是說(shuō)請(qǐng)求在消費(fèi)隊(duì)列發(fā)給了多個(gè)服務(wù)器節(jié)點(diǎn),所有服務(wù)器節(jié)點(diǎn)的消息隊(duì)列之和就是請(qǐng)求數(shù)。分布式遇上消息隊(duì)列,我們一起來(lái)看看存在哪些坑,又如何避免這些坑?

在業(yè)務(wù)系統(tǒng)的開(kāi)發(fā)當(dāng)中,為了保障系統(tǒng)的高性能、高可用,基本都會(huì)使用分布式架構(gòu),采用消息隊(duì)列將生產(chǎn)者(響應(yīng)調(diào)用的服務(wù))與消費(fèi)者(發(fā)起調(diào)用的服務(wù))進(jìn)行解耦,讓生產(chǎn)者服務(wù)和消費(fèi)者服務(wù)可以并行處理更多的程序調(diào)用、用戶請(qǐng)求。當(dāng)消息隊(duì)列遇上分布式,就變成了分布式消息隊(duì)列,也就是說(shuō)請(qǐng)求在消費(fèi)隊(duì)列發(fā)給了多個(gè)服務(wù)器節(jié)點(diǎn),所有服務(wù)器節(jié)點(diǎn)的消息隊(duì)列之和就是請(qǐng)求數(shù)。在分布式中最高頻的問(wèn)題便是數(shù)據(jù)一致性問(wèn)題,多個(gè)服務(wù)器節(jié)點(diǎn)因?yàn)闀r(shí)間空間的不一致從而接收到的數(shù)據(jù)、傳出去的數(shù)據(jù)都不一樣,在消息隊(duì)列中最高頻的問(wèn)題便是生產(chǎn)消費(fèi)不一致,從而導(dǎo)致數(shù)據(jù)丟失等。當(dāng)分布式遇上消息隊(duì)列,我們一起來(lái)看看存在哪些坑,又如何避免這些坑


01數(shù)據(jù)重復(fù)消費(fèi)之坑

在Kafka消息隊(duì)列的設(shè)計(jì)中,系統(tǒng)通過(guò)偏移量offset來(lái)標(biāo)記消息的順序。生產(chǎn)者服務(wù)將消息寫(xiě)進(jìn)隊(duì)列,消費(fèi)者從隊(duì)列里拿消息進(jìn)行消費(fèi),消費(fèi)成功后將偏移量提交,下次再消費(fèi)時(shí)就從最新的偏移量開(kāi)始消費(fèi)數(shù)據(jù)。在分布式消息隊(duì)列中,有可能會(huì)出現(xiàn)這樣的情況,生產(chǎn)者往隊(duì)列中寫(xiě)進(jìn)去了2條數(shù)據(jù),比如數(shù)據(jù)1偏移量為1,數(shù)據(jù)2偏移量為2,消費(fèi)者從隊(duì)列里先消費(fèi)了偏移量1,偏移量1提交成功,正要去消費(fèi)數(shù)據(jù)2時(shí),出現(xiàn)了斷電或進(jìn)程中斷等問(wèn)題導(dǎo)致系統(tǒng)重啟后,再去消費(fèi)了數(shù)據(jù)2,這樣就導(dǎo)致數(shù)據(jù)被重復(fù)消費(fèi)了。我們可通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)看看:

雙十一大促的時(shí)候,iPhone12在淘寶售賣(mài),Alice提交了訂單1進(jìn)行支付購(gòu)買(mǎi),Bob也提交了訂單2進(jìn)行支付購(gòu)買(mǎi),并且他們都購(gòu)買(mǎi)成功了,訂單系統(tǒng)會(huì)把所有成功的訂單信息都放在消息隊(duì)列,用以購(gòu)買(mǎi)成功后系統(tǒng)會(huì)給用戶推送消息,推送消息的服務(wù)從隊(duì)列里拿消息進(jìn)行消費(fèi),它先拿了消息1,給Alice推送了成功購(gòu)買(mǎi)的信息,并且標(biāo)記已成功處理消息,正當(dāng)它繼續(xù)去拿消息2推送時(shí),已經(jīng)推送成功了,但是在標(biāo)記推送成功時(shí)斷電了,等系統(tǒng)重啟后,消息推送系統(tǒng)又再次從消息2開(kāi)始處理,重新推送消息。對(duì)于Bob來(lái)說(shuō),他就收到了兩條重復(fù)消息,如果系統(tǒng)程序老出問(wèn)題,他就會(huì)一直收到重復(fù)消息,這樣的用戶體驗(yàn)非常不好。

避坑指南來(lái)了,那就是通過(guò)程序算法解決。當(dāng)用戶下訂單支付成功后,訂單的狀態(tài)會(huì)由開(kāi)始變?yōu)橹Ц冻晒虼渌?,消息推送系統(tǒng)再進(jìn)行消息推送時(shí)從消息隊(duì)列和訂單系統(tǒng)中同時(shí)獲取信息,doublecheck二者是否一致,再進(jìn)行消息的推送,從而避免了數(shù)據(jù)的重復(fù)消費(fèi)問(wèn)題。


02消息丟失之坑

我們知道完整的消息隊(duì)列系統(tǒng)是由三部分組成的,生產(chǎn)者、消息隊(duì)列、消費(fèi)者。在生產(chǎn)者生產(chǎn)消息給到消費(fèi)隊(duì)列、消息隊(duì)列存放消息、消費(fèi)者消費(fèi)消息這三個(gè)過(guò)程中,如果哪個(gè)過(guò)程出了問(wèn)題,都會(huì)導(dǎo)致消息丟失。如果是在購(gòu)買(mǎi)成功發(fā)送推送消息的場(chǎng)景,那么消息丟失都還好,不會(huì)產(chǎn)生什么損失。但如果是在下訂單的場(chǎng)景、減庫(kù)存的場(chǎng)景,消息丟失那就嚴(yán)重了。在下訂單場(chǎng)景中,多個(gè)用戶在平臺(tái)購(gòu)買(mǎi)商品,創(chuàng)建了訂單,但是因?yàn)橛唵蜗G失了,支付系統(tǒng)尚未獲取到訂單從而沒(méi)有去發(fā)起支付程序,新冠肺炎疫苗也救不了你了。在減庫(kù)存場(chǎng)景中,多個(gè)用戶參加秒殺活動(dòng),成功發(fā)起了創(chuàng)建訂單請(qǐng)求,這時(shí)候庫(kù)存系統(tǒng)進(jìn)行庫(kù)存的減少,然而訂單系統(tǒng)尚未收到,不斷的創(chuàng)建訂單,最后系統(tǒng)庫(kù)存都沒(méi)有了,前方還在不斷的創(chuàng)建訂單,iPhone12本來(lái)只有10個(gè)參加秒殺,現(xiàn)在變?yōu)?000個(gè),剩下的990個(gè),都需要商家全額購(gòu)買(mǎi)給到消費(fèi)者,不好意思,新冠肺炎疫苗也救不了你。

避坑指南來(lái)了,針對(duì)生產(chǎn)者存放消息進(jìn)隊(duì)列丟失的問(wèn)題,可以采用確認(rèn)機(jī)制,生產(chǎn)者生產(chǎn)的消息都帶上唯一ID,寫(xiě)入消息隊(duì)列后,消息隊(duì)列返回一個(gè)ack確認(rèn)消息,標(biāo)明成功接收,如果沒(méi)有接收到消息,則在超時(shí)時(shí)間范圍內(nèi)返回nack消息,標(biāo)明消息未接收成功。針對(duì)消息隊(duì)列丟消息的問(wèn)題,可以采用持久化方案,將消息隊(duì)列的消息放入在磁盤(pán)中,并且將創(chuàng)建的隊(duì)列持久化;針對(duì)消費(fèi)者丟消息的問(wèn)題,可以采用確認(rèn)機(jī)制,消費(fèi)者處理完消息之后,主動(dòng)返回ack消息告訴隊(duì)列,已處理完畢,超過(guò)時(shí)間范圍后則重新處理。


03消息亂序之坑

消息亂序是指生產(chǎn)者生產(chǎn)的消息順序和消費(fèi)者消費(fèi)的消息順序不一樣。在雙十一大促時(shí),Alice本來(lái)沒(méi)有什么要買(mǎi)的,但是看到大家都在買(mǎi)啊,那也就參加隨便買(mǎi)一點(diǎn),就當(dāng)是過(guò)節(jié)了,看到iPhone12價(jià)格4999還不錯(cuò),就下單買(mǎi)了一個(gè),吃了個(gè)飯回來(lái)后發(fā)現(xiàn)自己好像沒(méi)有什么需求,于是又把訂單取消了。這時(shí)候訂單系統(tǒng)有兩條消息,第一條訂單成功創(chuàng)建,第二條訂單取消。當(dāng)消息隊(duì)列系統(tǒng)中有多個(gè)消費(fèi)者時(shí),消費(fèi)者1拿到了第一條消息,去發(fā)貨了,消費(fèi)者2拿到了第二條消息,取消了訂單。對(duì)于Alice來(lái)說(shuō),他覺(jué)得既驚訝又開(kāi)心,不花一分錢(qián)就擁有了iPhone12,但對(duì)于商家來(lái)說(shuō),總收入和總庫(kù)存對(duì)不上,產(chǎn)生了損失,很難受。

避坑指南來(lái)了,那就是通過(guò)程序算法解決,第一針對(duì)同一個(gè)ID發(fā)起的消息,放入同一個(gè)隊(duì)列,第二創(chuàng)建多個(gè)消費(fèi)者,每個(gè)消費(fèi)者只消費(fèi)一個(gè)隊(duì)列。


04消息積壓之坑

消息積壓是指消息隊(duì)列的數(shù)據(jù)沒(méi)有被及時(shí)處理,場(chǎng)景1是消費(fèi)者出現(xiàn)了問(wèn)題不能來(lái)消費(fèi),從而導(dǎo)致消息全在隊(duì)列里,場(chǎng)景2是消費(fèi)者消費(fèi)速度太慢生產(chǎn)者生產(chǎn)太快,從而導(dǎo)致消息全在隊(duì)列里。典型的業(yè)務(wù)場(chǎng)景就是,雙十一大促時(shí),用戶發(fā)起了大量的訂單清單,但是庫(kù)存系統(tǒng)和支付系統(tǒng)都出現(xiàn)了問(wèn)題,導(dǎo)致訂單不能被處理,從而損失多筆訂單。

避坑指南是創(chuàng)建更多的隊(duì)列、更多的消費(fèi)者、加快消費(fèi)者消費(fèi)速度。

微服務(wù)是好東西,分布式也是好東西,消息隊(duì)列也是好東西,三者結(jié)合產(chǎn)生了更大的洪荒之力。但正如一枚硬幣有正也有反,它們帶來(lái)了更好的技術(shù)解決方案同時(shí)也帶來(lái)很多問(wèn)題,新技術(shù)的問(wèn)題破解還有待攻克,避坑指南全給你了,趕緊收藏吧~


標(biāo)簽: 分布式
熱門(mén)班型時(shí)間
人工智能就業(yè)班 即將爆滿
AI應(yīng)用線上班 即將爆滿
UI設(shè)計(jì)全能班 即將爆滿
數(shù)據(jù)分析綜合班 即將爆滿
軟件開(kāi)發(fā)全能班 爆滿開(kāi)班
網(wǎng)絡(luò)安全運(yùn)營(yíng)班 爆滿開(kāi)班
報(bào)名優(yōu)惠
免費(fèi)試聽(tīng)
課程資料
官方微信
返回頂部
培訓(xùn)課程 熱門(mén)話題 站內(nèi)鏈接