現(xiàn)在網(wǎng)上很多面試題,主要是針對技術(shù)本身的提問,比如:你聊聊對Dubbo的理解?你說說分布式事務是什么?
創(chuàng)新互聯(lián)建站是一家專業(yè)的成都網(wǎng)站建設公司,我們專注成都網(wǎng)站設計、網(wǎng)站建設、網(wǎng)絡營銷、企業(yè)網(wǎng)站建設,外鏈,廣告投放平臺為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設計到用戶體驗提高,創(chuàng)新互聯(lián)力求做到盡善盡美。這些問題就好比中學考試的送分題,比如默寫古詩,你只要準備了,下點功夫,都沒啥問題。
所以這里對技術(shù)本身的提問,其實就相當于送分題,主要是做一個基本的區(qū)分。你能回答出來,說明你至少平時還注意積累知識,不是一個混日子的工程師。
但是現(xiàn)在出去面試,尤其是一些大廠的面試越來越難了,從以前普通的技術(shù)知識本身,現(xiàn)在到了會考察你很多生產(chǎn)環(huán)境中的一些特殊狀況。
也就是說從以前的知識積累和背誦,到現(xiàn)在開始考察你的具體實踐和經(jīng)驗積累。
比如現(xiàn)在可能很多面試官開始這么問:你們項目里用Dubbo時,有沒有遇到什么技術(shù)問題?你們Dubbo服務的超時一般怎么設置的?服務之間調(diào)用一般會遇到超時嗎?如果超時了會怎么樣?
類似這樣的問題,都是在考察你對一個技術(shù)的實踐經(jīng)驗,而這目前越來越成為了面試的重點。
所以本文將通過一道面試中的經(jīng)典高頻問題:消息中間件消費到的消息處理失敗了怎么辦?
借助這道經(jīng)典題目,來闡述一下這個問題。我們應該從哪些角度思考,才能做出滿分回答。
這是一個非常典型的生產(chǎn)環(huán)境的問題,很多公司都會在生產(chǎn)系統(tǒng)里使用MQ,即消息隊列,或者消息中間件。
也就是說,一個系統(tǒng)跟另外一個系統(tǒng)之間進行通信的時候,假如系統(tǒng)A希望發(fā)送一個消息給系統(tǒng)B,讓他去處理。
但是系統(tǒng)A不關注系統(tǒng)B到底怎么處理或者有沒有處理好,所以系統(tǒng)A把消息發(fā)送給MQ,然后就不管這條消息的“死活”了,接著系統(tǒng)B從MQ里消費出來處理即可。
至于怎么處理,是否處理完畢,什么時候處理,都是系統(tǒng)B的事兒,與系統(tǒng)A無關。
上述過程,可以通過下圖看的很清晰:
這樣的一種通信方式,就是所謂的“異步”通信方式
對于系統(tǒng)A來說,只要把消息發(fā)給MQ,然后系統(tǒng)B就會異步的去進行處理了,系統(tǒng)A不需要“同步”的等待系統(tǒng)B處理完。
這樣的好處是什么呢?
兩個字:解耦
系統(tǒng)A要跟系統(tǒng)B通信,但是他不需要關注系統(tǒng)B如何處理的一些細節(jié)。我們來舉幾個例子說明:
比如,A不需要關注B什么時候處理完,這樣假如系統(tǒng)B處理一個消息要耗費10分鐘也不關系統(tǒng)A的事兒。
否則,系統(tǒng)A直接調(diào)用系統(tǒng)B的接口,系統(tǒng)B一下子處理了10分鐘怎么辦?難不成系統(tǒng)A也阻塞等待10分鐘?
再比如,系統(tǒng)A不需要關注系統(tǒng)B處理成功與否,即使系統(tǒng)B處理失敗了,也是系統(tǒng)B自己去考慮這個場景和重新嘗試處理。
否則如果系統(tǒng)調(diào)用系統(tǒng)B的接口,萬一處理失敗了報錯了,系統(tǒng)A受到一個調(diào)用異常該怎么處理?
還有,系統(tǒng)A不需要關注系統(tǒng)B是否存活。萬一要是系統(tǒng)B掛掉了,系統(tǒng)A通過MQ來通信也不需要管系統(tǒng)B的“死活”,系統(tǒng)B自己恢復了之后就可以從MQ消費消息再次處理即可。
否則系統(tǒng)A直接調(diào)用系統(tǒng)B的接口,萬一系統(tǒng)B掛了,難道系統(tǒng)A還要把消息暫存到數(shù)據(jù)庫?等待系統(tǒng)B恢復了再給他發(fā)過去嗎?
這就是通過MQ進行異步通信,讓兩個系統(tǒng)解耦之后的好處,可以大幅度提升整個大系統(tǒng)的容錯性,增加系統(tǒng)的彈性,而不是處處耦合,一個系統(tǒng)出錯連帶導致其他系統(tǒng)全部出錯。
解耦之后,即使出錯也只是大系統(tǒng)中的一個系統(tǒng)B出錯而已,不影響別人。
接下來用一個經(jīng)典的生產(chǎn)案例給大家說說MQ在生產(chǎn)的使用。
現(xiàn)在很多早教類的APP,都會提供早教盒子,什么意思呢?
早教APP提供的核心服務就是三塊:
這樣一個媽媽陪伴孩子上早教的過程可能是這樣的:
所以說,假設現(xiàn)在我們要在一個早教APP里購買一個早教課程,他的流程大致如下:
我們來分析一下每個環(huán)節(jié)。首先你要是購買一個早教課程,那么點擊“購買”的按鈕之后,一般直接會跳入一個支付界面。
這個時候,你就可以直接選擇支付了。此時后臺系統(tǒng)一定會通過支付系統(tǒng)跟第三方支付系統(tǒng)進行通信,比如說支付寶、微信之類的,然后等待支付完成。
一旦支付完成,就會在自己內(nèi)部系統(tǒng)干兩個事:
此時用戶其實在“我的訂單”界面就可以看到自己的訂單了,而且在“我的課程”界面,就可以開始看早教課程的視頻了。
如果對上面過程不太理解的,再看看下面的圖,應該就清楚了:
但是現(xiàn)在問題主要在后面兩個步驟,現(xiàn)在你的訂單系統(tǒng)作為核心入口,他要通知倉庫系統(tǒng)去扣減一個早教盒子的庫存。
同時,還得準備好早教盒子的發(fā)貨(比如說提前打包裝箱,準備一些給快遞公司使用的發(fā)貨單之類的,需要帖子箱子上)。
然后通知第三方物流公司的系統(tǒng),可以去自己的倉庫取早教盒子發(fā)貨了。
這兩個步驟需要涉及到對倉庫系統(tǒng)以及第三方物流公司系統(tǒng)的調(diào)用,那么是采用訂單系統(tǒng)直接同步調(diào)用那兩個系統(tǒng)的方式嗎?
恐怕不妥,因為這里大的問題就是性能問題和可用性問題。
舉個例子,假如現(xiàn)在倉庫系統(tǒng)部署在其他地方,因為網(wǎng)絡問題導致性能很差,訪問速度很慢,那么是不是可能會導致用戶支付之后,等待了幾分鐘都看不到整個流程的完成?
或者要是說第三方物流公司的系統(tǒng)現(xiàn)在要是故障了,暫時無法訪問,那么會不會導致用戶支付了之后,一直沒有給用戶發(fā)貨早教盒子?
所以說,在這里就應該引入MQ,訂單系統(tǒng)在完成訂單的創(chuàng)建以及課程的分配之后,就可以發(fā)送一個消息到MQ,然后有一個專門的倉儲系統(tǒng)負責消費這個消息,接著嘗試去調(diào)用獨立倉庫系統(tǒng)通知發(fā)貨,以及通知第三方物流系統(tǒng)去配送。
整個過程,如下圖所示:
這么做有什么好處呢?
好處是顯而易見的,假如現(xiàn)在獨立倉庫系統(tǒng)和第三方物流系統(tǒng)的訪問性能突然變得很差,大不了就是倉儲系統(tǒng)在后面慢慢的跟人家通信等著人家處理完畢好了,對訂單系統(tǒng)是沒影響的。
對于訂單系統(tǒng)而言,創(chuàng)建訂單和分配課程都是速度很快的,然后發(fā)送個消息到MQ速度也很快。
這樣一來,用戶看到的就是一兩秒的時間支付就成功了,然后可以查到訂單,看到自己的課程,然后訂單的物流顯示的是“待配送”的狀態(tài)。
那么如果獨立倉庫系統(tǒng)或者第三方物流系統(tǒng)故障了,導致倉儲系統(tǒng)消費到一條訂單消息之后,嘗試進行發(fā)貨失敗,也就是對這條消費到的消息處理失敗。這種情況,怎么處理?
這就是本文最核心的地方了?。?!
一般生產(chǎn)環(huán)境中,如果你有豐富的架構(gòu)設計經(jīng)驗,都會在使用MQ的時候設計兩個隊列:一個是核心業(yè)務隊列,一個是死信隊列。
核心業(yè)務隊列,就是比如上面專門用來讓訂單系統(tǒng)發(fā)送訂單消息的,然后另外一個死信隊列就是用來處理異常情況的。
之所以我們這篇文章拋出一個面試題,結(jié)果先長篇大論說一個生產(chǎn)實踐案例和業(yè)務場景,就是因為面試被問到這個問題時,必須要結(jié)合你自己的業(yè)務實踐經(jīng)驗來說。
你需要先給面試官說有血有肉的業(yè)務系統(tǒng)場景,然后再結(jié)合這個場景回答他的問題,因為面試官想聽的就是你真實的實踐經(jīng)驗。
比如說要是第三方物流系統(tǒng)故障了,此時無法請求,那么倉儲系統(tǒng)每次消費到一條訂單消息,嘗試通知發(fā)貨和配送,都會遇到對方的接口報錯。
此時倉儲系統(tǒng)就可以把這條消息拒絕訪問,或者標志位處理失敗!注意,這個步驟很重要。
一旦標志這條消息處理失敗了之后,MQ就會把這條消息轉(zhuǎn)入提前設置好的一個死信隊列中。
然后你會看到的就是,在第三方物流系統(tǒng)故障期間,所有訂單消息全部處理失敗,全部會轉(zhuǎn)入死信隊列。
然后你的倉儲系統(tǒng)得專門有一個后臺線程,監(jiān)控第三方物流系統(tǒng)是否正常,能否請求的,不停的監(jiān)視。
一旦發(fā)現(xiàn)對方恢復正常,這個后臺線程就從死信隊列消費出來處理失敗的訂單,重新執(zhí)行發(fā)貨和配送的通知邏輯。
死信隊列的使用,其實就是MQ在生產(chǎn)實踐中非常重要的一環(huán),也就是架構(gòu)設計必須要考慮的。
整個過程,如下圖所示:
最后再給各位朋友強調(diào)一下,如果面試被問到生產(chǎn)實踐類的問題,一定記?。航Y(jié)合有血有肉的業(yè)務系統(tǒng)和場景來闡述你的實踐經(jīng)驗,以及在業(yè)務場景下,應該如何設計技術(shù)方案。
這樣你的回答,才能匹配上面試官內(nèi)心深處最希望聽到的滿分答案!
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。