新聞中心
消息隊列將我們系統(tǒng)從同步調用改成了異步調用,將我們的系統(tǒng)進行解耦,但隨之也帶來一個問題,那便是如何保證消息使命必達。

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


咨詢
建站咨詢
