新聞中心
消息隊(duì)列將我們系統(tǒng)從同步調(diào)用改成了異步調(diào)用,將我們的系統(tǒng)進(jìn)行解耦,但隨之也帶來(lái)一個(gè)問(wèn)題,那便是如何保證消息使命必達(dá)。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的灌云網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
舉個(gè)例子,在電商系統(tǒng)中,用戶(hù)下單后,我們通常是使用異步消息去通知購(gòu)物車(chē)系統(tǒng)清空對(duì)應(yīng)的購(gòu)物車(chē)物品的。如果我們不能夠保證消息使命必達(dá),那么就意味著有些用戶(hù)下完單之后,他的購(gòu)物車(chē)還有原來(lái)這些物品,造成不好的體驗(yàn)。所以,一個(gè)可用的消息隊(duì)列,必須是可靠,那么如何去保證消息生產(chǎn)到消費(fèi)的過(guò)程中,是可靠的呢。
一般來(lái)說(shuō),消息隊(duì)列隊(duì)列有三個(gè)重要步驟,分別是生產(chǎn)-存儲(chǔ)-消費(fèi)。這一點(diǎn)很多同學(xué)都會(huì)沒(méi)有注意到,甚至很多人調(diào)用消息隊(duì)列的時(shí)候都會(huì)經(jīng)常忘記去處理異常。在通常情況下,生產(chǎn)消息都是可以成功的,但是,在一些極端的條件下,例如網(wǎng)絡(luò)波動(dòng),或者機(jī)器宕機(jī),往往會(huì)造成消息入隊(duì)失敗,這就要求我們需要處理對(duì)應(yīng)的異常。在消息入隊(duì)失敗的時(shí)候,進(jìn)行重試或者直接回滾相應(yīng)的事務(wù),并且告訴前端處理失敗。
其次,則是消息的存儲(chǔ)階段。雖然我們的消息隊(duì)列已經(jīng)經(jīng)歷了非常多場(chǎng)景的考驗(yàn),但是在生產(chǎn)環(huán)境中,應(yīng)用的重啟也是常態(tài)。為了避免應(yīng)用重啟帶了的數(shù)據(jù)丟失,我們最好是將數(shù)據(jù)進(jìn)行落盤(pán),即便是我們重啟應(yīng)用,也不會(huì)造成數(shù)據(jù)丟失。其次,硬件的損壞不可避免,服務(wù)器也是有使用壽命的,也是有可能遭遇到意外,如果我們的數(shù)據(jù)只存在一臺(tái)機(jī)器上,一旦機(jī)器損壞,就有可能會(huì)丟失數(shù)據(jù),所以,常見(jiàn)的做法是每條消息都會(huì)至少在兩臺(tái)機(jī)器上寫(xiě)成功才會(huì)返回成功。為什么是兩臺(tái)機(jī)器呢,因?yàn)閺母怕蕦W(xué)的角度上來(lái)說(shuō),同一個(gè)集群在不同機(jī)房的兩臺(tái)機(jī)器,同時(shí)遇到故障的概率幾乎為0。
最后則是在消息的消費(fèi)階段,很多同學(xué)有非常不好的編寫(xiě)代碼習(xí)慣,就是不處理異常,無(wú)論代碼執(zhí)行的結(jié)果如何,都會(huì)告訴消息隊(duì)列消息消費(fèi)成功,這是非常不好的。我們就曾經(jīng)遇到這樣一個(gè)例子,每次用戶(hù)成交之后,我們都會(huì)回調(diào)給商家,通知商家數(shù)據(jù)變更,可以來(lái)拉取數(shù)據(jù)。這只是一個(gè)非常簡(jiǎn)單的HTTP GET請(qǐng)求,按道理來(lái)說(shuō),是很難失敗的。但是,有些商家的開(kāi)發(fā)能力差,服務(wù)器經(jīng)常宕機(jī),剛好這個(gè)商家今天就成交這一單。因?yàn)闆](méi)有處理HTTP的異常,消息被判斷為消費(fèi)成功,就會(huì)造成商家的數(shù)據(jù)錯(cuò)誤。
如果你以為只要做好重試就行了,那就太天真了。在現(xiàn)代分布式系統(tǒng)中,有一種特殊情況特別需要程序員注意的,那就是對(duì)于超時(shí)的處理,在程序異常中,很多異常我們都可以認(rèn)為下游系統(tǒng)處理失敗了,唯有超時(shí)異常,我們很難去判斷下游系統(tǒng)是否已經(jīng)處理成功。這就需要我們對(duì)消息隊(duì)列進(jìn)行設(shè)計(jì),盡量保證我們的系統(tǒng)是冪等的,從而保證消息不會(huì)因?yàn)橹貜?fù)消費(fèi)而帶來(lái)新的問(wèn)題。
分享標(biāo)題:消息隊(duì)列誰(shuí)都會(huì)用,程序的好壞在于如何保證消息萬(wàn)無(wú)一失
文章URL:http://www.5511xx.com/article/cdcpsdg.html


咨詢(xún)
建站咨詢(xún)
