溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

消息中間件消費(fèi)到的消息處理失敗怎么辦?熱門(mén)面試題的滿分答案!

發(fā)布時(shí)間:2020-07-04 02:42:05 來(lái)源:網(wǎng)絡(luò) 閱讀:138 作者:wx5d9ed7c8443c3 欄目:編程語(yǔ)言

1、日趨流行的面試問(wèn)法

現(xiàn)在網(wǎng)上很多面試題,主要是針對(duì)技術(shù)本身的提問(wèn),比如:你聊聊對(duì)Dubbo的理解?你說(shuō)說(shuō)分布式事務(wù)是什么?

這些問(wèn)題就好比中學(xué)考試的送分題,比如默寫(xiě)古詩(shī),你只要準(zhǔn)備了,下點(diǎn)功夫,都沒(méi)啥問(wèn)題。

所以這里對(duì)技術(shù)本身的提問(wèn),其實(shí)就相當(dāng)于送分題,主要是做一個(gè)基本的區(qū)分。你能回答出來(lái),說(shuō)明你至少平時(shí)還注意積累知識(shí),不是一個(gè)混日子的工程師。

但是現(xiàn)在出去面試,尤其是一些大廠的面試越來(lái)越難了,從以前普通的技術(shù)知識(shí)本身,現(xiàn)在到了會(huì)考察你很多生產(chǎn)環(huán)境中的一些特殊狀況。

也就是說(shuō)從以前的知識(shí)積累和背誦,到現(xiàn)在開(kāi)始考察你的具體實(shí)踐和經(jīng)驗(yàn)積累。

比如現(xiàn)在可能很多面試官開(kāi)始這么問(wèn):你們項(xiàng)目里用Dubbo時(shí),有沒(méi)有遇到什么技術(shù)問(wèn)題?你們Dubbo服務(wù)的超時(shí)一般怎么設(shè)置的?服務(wù)之間調(diào)用一般會(huì)遇到超時(shí)嗎?如果超時(shí)了會(huì)怎么樣?

類(lèi)似這樣的問(wèn)題,都是在考察你對(duì)一個(gè)技術(shù)的實(shí)踐經(jīng)驗(yàn),而這目前越來(lái)越成為了面試的重點(diǎn)。

所以本文將通過(guò)一道面試中的經(jīng)典高頻問(wèn)題:消息中間件消費(fèi)到的消息處理失敗了怎么辦?

借助這道經(jīng)典題目,來(lái)闡述一下這個(gè)問(wèn)題。我們應(yīng)該從哪些角度思考,才能做出滿分回答。

2、消息中間件在生產(chǎn)系統(tǒng)中的使用

這是一個(gè)非常典型的生產(chǎn)環(huán)境的問(wèn)題,很多公司都會(huì)在生產(chǎn)系統(tǒng)里使用MQ,即消息隊(duì)列,或者消息中間件。

也就是說(shuō),一個(gè)系統(tǒng)跟另外一個(gè)系統(tǒng)之間進(jìn)行通信的時(shí)候,假如系統(tǒng)A希望發(fā)送一個(gè)消息給系統(tǒng)B,讓他去處理。

但是系統(tǒng)A不關(guān)注系統(tǒng)B到底怎么處理或者有沒(méi)有處理好,所以系統(tǒng)A把消息發(fā)送給MQ,然后就不管這條消息的“死活”了,接著系統(tǒng)B從MQ里消費(fèi)出來(lái)處理即可。

至于怎么處理,是否處理完畢,什么時(shí)候處理,都是系統(tǒng)B的事兒,與系統(tǒng)A無(wú)關(guān)。

上述過(guò)程,可以通過(guò)下圖看的很清晰:

消息中間件消費(fèi)到的消息處理失敗怎么辦?熱門(mén)面試題的滿分答案!

這樣的一種通信方式,就是所謂的“異步”通信方式

對(duì)于系統(tǒng)A來(lái)說(shuō),只要把消息發(fā)給MQ,然后系統(tǒng)B就會(huì)異步的去進(jìn)行處理了,系統(tǒng)A不需要“同步”的等待系統(tǒng)B處理完。

這樣的好處是什么呢?

兩個(gè)字:解耦

系統(tǒng)A要跟系統(tǒng)B通信,但是他不需要關(guān)注系統(tǒng)B如何處理的一些細(xì)節(jié)。我們來(lái)舉幾個(gè)例子說(shuō)明:

比如,A不需要關(guān)注B什么時(shí)候處理完,這樣假如系統(tǒng)B處理一個(gè)消息要耗費(fèi)10分鐘也不關(guān)系統(tǒng)A的事兒。

否則,系統(tǒng)A直接調(diào)用系統(tǒng)B的接口,系統(tǒng)B一下子處理了10分鐘怎么辦?難不成系統(tǒng)A也阻塞等待10分鐘?

再比如,系統(tǒng)A不需要關(guān)注系統(tǒng)B處理成功與否,即使系統(tǒng)B處理失敗了,也是系統(tǒng)B自己去考慮這個(gè)場(chǎng)景和重新嘗試處理。

否則如果系統(tǒng)調(diào)用系統(tǒng)B的接口,萬(wàn)一處理失敗了報(bào)錯(cuò)了,系統(tǒng)A受到一個(gè)調(diào)用異常該怎么處理?

還有,系統(tǒng)A不需要關(guān)注系統(tǒng)B是否存活。萬(wàn)一要是系統(tǒng)B掛掉了,系統(tǒng)A通過(guò)MQ來(lái)通信也不需要管系統(tǒng)B的“死活”,系統(tǒng)B自己恢復(fù)了之后就可以從MQ消費(fèi)消息再次處理即可。

否則系統(tǒng)A直接調(diào)用系統(tǒng)B的接口,萬(wàn)一系統(tǒng)B掛了,難道系統(tǒng)A還要把消息暫存到數(shù)據(jù)庫(kù)?等待系統(tǒng)B恢復(fù)了再給他發(fā)過(guò)去嗎?

這就是通過(guò)MQ進(jìn)行異步通信,讓兩個(gè)系統(tǒng)解耦之后的好處,可以大幅度提升整個(gè)大系統(tǒng)的容錯(cuò)性,增加系統(tǒng)的彈性,而不是處處耦合,一個(gè)系統(tǒng)出錯(cuò)連帶導(dǎo)致其他系統(tǒng)全部出錯(cuò)。

解耦之后,即使出錯(cuò)也只是大系統(tǒng)中的一個(gè)系統(tǒng)B出錯(cuò)而已,不影響別人。

3、經(jīng)典生產(chǎn)案例:早教盒子APP的發(fā)貨

接下來(lái)用一個(gè)經(jīng)典的生產(chǎn)案例給大家說(shuō)說(shuō)MQ在生產(chǎn)的使用。

現(xiàn)在很多早教類(lèi)的APP,都會(huì)提供早教盒子,什么意思呢?

早教APP提供的核心服務(wù)就是三塊:

  1. APP里的早教視頻課程
  2. 線上微信群的助教答疑指導(dǎo)
  3. 線下送你早教盒子,里面有很多上課道具

這樣一個(gè)媽媽陪伴孩子上早教的過(guò)程可能是這樣的:

  • 首先在APP里看早教視頻課程,孩子看著很感興趣。
  • 接著媽媽從早教盒子里取出來(lái)道具,陪孩子把視頻里的game和任務(wù)都做一遍,讓孩子加深印象
  • 最后每天媽媽會(huì)打卡,有助教會(huì)來(lái)給媽媽進(jìn)行答疑。

所以說(shuō),假設(shè)現(xiàn)在我們要在一個(gè)早教APP里購(gòu)買(mǎi)一個(gè)早教課程,他的流程大致如下:

  • 選擇購(gòu)買(mǎi)早教課程
  • 直接支付
  • 創(chuàng)建訂單
  • 給用戶(hù)增加課程權(quán)限
  • 通知倉(cāng)庫(kù)準(zhǔn)備發(fā)早教盒子
  • 通知物流公司去倉(cāng)庫(kù)取早教盒子進(jìn)行配送。

我們來(lái)分析一下每個(gè)環(huán)節(jié)。首先你要是購(gòu)買(mǎi)一個(gè)早教課程,那么點(diǎn)擊“購(gòu)買(mǎi)”的按鈕之后,一般直接會(huì)跳入一個(gè)支付界面。

這個(gè)時(shí)候,你就可以直接選擇支付了。此時(shí)后臺(tái)系統(tǒng)一定會(huì)通過(guò)支付系統(tǒng)跟第三方支付系統(tǒng)進(jìn)行通信,比如說(shuō)支付寶、微信之類(lèi)的,然后等待支付完成。

一旦支付完成,就會(huì)在自己內(nèi)部系統(tǒng)干兩個(gè)事:

  • 第一,給這個(gè)用戶(hù)id創(chuàng)建一個(gè)訂單;
  • 第二,給這個(gè)用戶(hù)id增加看某個(gè)早教視頻課程的權(quán)限。

此時(shí)用戶(hù)其實(shí)在“我的訂單”界面就可以看到自己的訂單了,而且在“我的課程”界面,就可以開(kāi)始看早教課程的視頻了。

如果對(duì)上面過(guò)程不太理解的,再看看下面的圖,應(yīng)該就清楚了:

消息中間件消費(fèi)到的消息處理失敗怎么辦?熱門(mén)面試題的滿分答案!

但是現(xiàn)在問(wèn)題主要在后面兩個(gè)步驟,現(xiàn)在你的訂單系統(tǒng)作為核心入口,他要通知倉(cāng)庫(kù)系統(tǒng)去扣減一個(gè)早教盒子的庫(kù)存。

同時(shí),還得準(zhǔn)備好早教盒子的發(fā)貨(比如說(shuō)提前打包裝箱,準(zhǔn)備一些給快遞公司使用的發(fā)貨單之類(lèi)的,需要帖子箱子上)。

然后通知第三方物流公司的系統(tǒng),可以去自己的倉(cāng)庫(kù)取早教盒子發(fā)貨了。

這兩個(gè)步驟需要涉及到對(duì)倉(cāng)庫(kù)系統(tǒng)以及第三方物流公司系統(tǒng)的調(diào)用,那么是采用訂單系統(tǒng)直接同步調(diào)用那兩個(gè)系統(tǒng)的方式嗎?

恐怕不妥,因?yàn)檫@里最大的問(wèn)題就是性能問(wèn)題可用性問(wèn)題。

舉個(gè)例子,假如現(xiàn)在倉(cāng)庫(kù)系統(tǒng)部署在其他地方,因?yàn)榫W(wǎng)絡(luò)問(wèn)題導(dǎo)致性能很差,訪問(wèn)速度很慢,那么是不是可能會(huì)導(dǎo)致用戶(hù)支付之后,等待了幾分鐘都看不到整個(gè)流程的完成?

或者要是說(shuō)第三方物流公司的系統(tǒng)現(xiàn)在要是故障了,暫時(shí)無(wú)法訪問(wèn),那么會(huì)不會(huì)導(dǎo)致用戶(hù)支付了之后,一直沒(méi)有給用戶(hù)發(fā)貨早教盒子?

所以說(shuō),在這里就應(yīng)該引入MQ,訂單系統(tǒng)在完成訂單的創(chuàng)建以及課程的分配之后,就可以發(fā)送一個(gè)消息到MQ,然后有一個(gè)專(zhuān)門(mén)的倉(cāng)儲(chǔ)系統(tǒng)負(fù)責(zé)消費(fèi)這個(gè)消息,接著嘗試去調(diào)用獨(dú)立倉(cāng)庫(kù)系統(tǒng)通知發(fā)貨,以及通知第三方物流系統(tǒng)去配送。

整個(gè)過(guò)程,如下圖所示:

消息中間件消費(fèi)到的消息處理失敗怎么辦?熱門(mén)面試題的滿分答案!

這么做有什么好處呢?

好處是顯而易見(jiàn)的,假如現(xiàn)在獨(dú)立倉(cāng)庫(kù)系統(tǒng)和第三方物流系統(tǒng)的訪問(wèn)性能突然變得很差,大不了就是倉(cāng)儲(chǔ)系統(tǒng)在后面慢慢的跟人家通信等著人家處理完畢好了,對(duì)訂單系統(tǒng)是沒(méi)影響的。

對(duì)于訂單系統(tǒng)而言,創(chuàng)建訂單和分配課程都是速度很快的,然后發(fā)送個(gè)消息到MQ速度也很快。

這樣一來(lái),用戶(hù)看到的就是一兩秒的時(shí)間支付就成功了,然后可以查到訂單,看到自己的課程,然后訂單的物流顯示的是“待配送”的狀態(tài)。

那么如果獨(dú)立倉(cāng)庫(kù)系統(tǒng)或者第三方物流系統(tǒng)故障了,導(dǎo)致倉(cāng)儲(chǔ)系統(tǒng)消費(fèi)到一條訂單消息之后,嘗試進(jìn)行發(fā)貨失敗,也就是對(duì)這條消費(fèi)到的消息處理失敗。這種情況,怎么處理?

這就是本文最核心的地方了?。?!

4、死信隊(duì)列的使用:處理失敗的消息

一般生產(chǎn)環(huán)境中,如果你有豐富的架構(gòu)設(shè)計(jì)經(jīng)驗(yàn),都會(huì)在使用MQ的時(shí)候設(shè)計(jì)兩個(gè)隊(duì)列:一個(gè)是核心業(yè)務(wù)隊(duì)列,一個(gè)是死信隊(duì)列。

核心業(yè)務(wù)隊(duì)列,就是比如上面專(zhuān)門(mén)用來(lái)讓訂單系統(tǒng)發(fā)送訂單消息的,然后另外一個(gè)死信隊(duì)列就是用來(lái)處理異常情況的。

之所以我們這篇文章拋出一個(gè)面試題,結(jié)果先長(zhǎng)篇大論說(shuō)一個(gè)生產(chǎn)實(shí)踐案例和業(yè)務(wù)場(chǎng)景,就是因?yàn)槊嬖嚤粏?wèn)到這個(gè)問(wèn)題時(shí),必須要結(jié)合你自己的業(yè)務(wù)實(shí)踐經(jīng)驗(yàn)來(lái)說(shuō)。

你需要先給面試官說(shuō)有血有肉的業(yè)務(wù)系統(tǒng)場(chǎng)景,然后再結(jié)合這個(gè)場(chǎng)景回答他的問(wèn)題,因?yàn)槊嬖嚬傧肼?tīng)的就是你真實(shí)的實(shí)踐經(jīng)驗(yàn)。

比如說(shuō)要是第三方物流系統(tǒng)故障了,此時(shí)無(wú)法請(qǐng)求,那么倉(cāng)儲(chǔ)系統(tǒng)每次消費(fèi)到一條訂單消息,嘗試通知發(fā)貨和配送,都會(huì)遇到對(duì)方的接口報(bào)錯(cuò)。

此時(shí)倉(cāng)儲(chǔ)系統(tǒng)就可以把這條消息拒絕訪問(wèn),或者標(biāo)志位處理失??!注意,這個(gè)步驟很重要。

一旦標(biāo)志這條消息處理失敗了之后,MQ就會(huì)把這條消息轉(zhuǎn)入提前設(shè)置好的一個(gè)死信隊(duì)列中。

然后你會(huì)看到的就是,在第三方物流系統(tǒng)故障期間,所有訂單消息全部處理失敗,全部會(huì)轉(zhuǎn)入死信隊(duì)列。

然后你的倉(cāng)儲(chǔ)系統(tǒng)得專(zhuān)門(mén)有一個(gè)后臺(tái)線程,監(jiān)控第三方物流系統(tǒng)是否正常,能否請(qǐng)求的,不停的監(jiān)視。

一旦發(fā)現(xiàn)對(duì)方恢復(fù)正常,這個(gè)后臺(tái)線程就從死信隊(duì)列消費(fèi)出來(lái)處理失敗的訂單,重新執(zhí)行發(fā)貨和配送的通知邏輯。

死信隊(duì)列的使用,其實(shí)就是MQ在生產(chǎn)實(shí)踐中非常重要的一環(huán),也就是架構(gòu)設(shè)計(jì)必須要考慮的。

整個(gè)過(guò)程,如下圖所示:

消息中間件消費(fèi)到的消息處理失敗怎么辦?熱門(mén)面試題的滿分答案!

5、總結(jié)

最后再給各位朋友強(qiáng)調(diào)一下,如果面試被問(wèn)到生產(chǎn)實(shí)踐類(lèi)的問(wèn)題,一定記?。航Y(jié)合有血有肉的業(yè)務(wù)系統(tǒng)和場(chǎng)景來(lái)闡述你的實(shí)踐經(jīng)驗(yàn),以及在業(yè)務(wù)場(chǎng)景下,應(yīng)該如何設(shè)計(jì)技術(shù)方案。

這樣你的回答,才能匹配上面試官內(nèi)心深處最希望聽(tīng)到的滿分答案!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI