互聯網公司的專案沒有不用到MQ(訊息佇列)的,在簡歷中寫上專案中用到MQ,也算是亮點之一,既然你寫了,面試官就會問,你對MQ到底了解多少?
一個挺著啤酒肚,身穿格子衫,發際線嚴重后移的中年男子,手拿著保溫杯,胳膊夾著MacBook向你走來,
面試官:小伙子,我看你簡歷上寫了,在專案中用到了MQ,你們專案為什么要引入MQ?
內心閃過一萬匹馬,引入MQ是我能決定的嗎?
CTO讓我們用,我們就用了唄!
雖然事實是這樣,但是如果這樣直接回答,肯定讓你回去等通知了,
其實這道題就是讓你回答MQ的作用是什么?
MQ的作用就三個:解耦、異步、削峰, 如果你直接回答這三個作用,會給面試官一種死記硬背的嫌疑,所以要結合實際專案具體分析,
1. 解耦
面試官你好,我們公司是做電商系統的,核心是交易服務,交易服務要呼叫另外三個服務,訂單服務、庫存服務、倉儲服務,

這三個服務如果有一個服務不可用,交易服務就無法正常運行,所以交易服務是強耦合另外三個服務,
引入MQ之后,交易服務只跟MQ互動,把訊息發到MQ里面就行了,無需關心另外三個服務是否可用,這時候交易服務跟另外三個服務就是弱耦合的關系,耦合性被降低了,
哪怕是另外三個服務暫時不可用,也不影響交易服務的運行,只要其他服務運行起來后,把MQ里面的訊息消費了就行,

2. 異步
沒有引入MQ的時候,交易服務需要同步呼叫三個服務,如果呼叫一個服務需要耗時1秒,那么同步呼叫三個服務需要耗時3秒,在引入MQ之后,全都改成了異步呼叫,整個耗時不到1秒,大大提高了介面的性能,
3. 削峰
如果一秒內同時來了5000筆交易,而訂單服務每秒只能處理100筆交易,那么后面的4900筆交易失敗,在引入MQ之后,交易服務可以把交易資料先發送到MQ中,而訂單服務再慢慢從MQ拉取交易資訊處理,從而避免突發流量壓垮服務器,
面試官: 小伙子,有點東西,看來準備的很充分啊,那你知道引入MQ有什么壞處嗎?MQ不可能全是優點吧?
當然,我覺得引入MQ之后,會有以下三個壞處,
1. 系統可用性降低
本來整個系統有四個服務,我們只需要保證這四個服務可用就行了,現在又多引入了一個MQ,我們還要保證MQ的可用,所以整個系統的可用性降低,
2. 系統復雜性提高
本來交易服務是同步呼叫另外三個服務,如果另外三個服務不可用,交易服務能立即感知到,引入MQ之后,整個系統的穩定性就要靠MQ保證了,
這時候,我們就要考慮到發到MQ里面的訊息怎么避免丟失的問題?
順序性消費的問題,就是同一筆交易的下單訊息應該比撤單訊息先處理,
重復性消費的問題,就是同一筆下單交易的訊息可能被多次處理,
當然,每種問題都有具體的解決方案,
避免訊息丟失可以使用MQ集群,
順序性消費可以把訊息發到同一個磁區,
重復性消費可以在消費端做冪等性處理,這里不做詳細闡述,
以后再講一下每種MQ不同的具體實作方式,
3. 資料一致性問題
當服務間是同步呼叫的時候,我們還可以使用本地事務來控制資料的一致性,但是引入MQ之后,服務間的呼叫都是異步了,就沒辦法使用本地事務,也就無法做到資料的強一致性了,
例如,呼叫訂單服務下單成功了,但是呼叫庫存服務扣減庫存失敗,就會導致超賣,是嚴重的線上事故,
這時候怎么辦?可以使用MQ事務訊息,相當于是同步呼叫,會嚴重降低性能, 還可以使用分布式事務,可以實作資料的最終一致性,無法做到強一致性,
面試官內心豎起大拇指,小伙子可以啊,明天就來上班吧!
我在上家公司的作業還沒交接完成,要不再等兩周吧?
是不是嫌工資開得低了,我這就讓HR加薪,明天一定要來,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/492168.html
標籤:Java
