1. 程式人生 > >面試寶典之為什麼使用訊息佇列?

面試寶典之為什麼使用訊息佇列?

1、為什麼使用訊息佇列?

面試官心理剖析:
看你平時有沒有思考,是不是為了用而用?面試官主要想知道你們是什麼業務使用了MQ,沒用的時候有什麼問題?用了之後給你們帶來了哪些好處?

回答:
使用的場景很多,但是把核心的場景說出來就可以了,核心場景有:解耦、非同步、削峰;
(1)、解耦:
場景分析:
有A、B、C系統,現在A系統呼叫B、C系統的介面。又來一個E系統也需要A呼叫,可能過段時間B系統不需要A呼叫了。每次變更對A系統的維護人都是很痛苦的。A系統還要考慮如果其他系統掛了怎麼辦?是否需要重試?這樣系統嚴重的耦合在一起。

(2)、非同步:
場景分析:
A系統呼叫B、C系統,因為是同步呼叫,使用者發起請求到得到響應要花費2s,使用者是不能忍受的。
問題解決:
使用MQ,B、C系統的處理時間是非同步的,只有A系統的處理時間,在加上呼叫MQ的時間,那麼使用者那邊可以快速得到響應,使用非同步的前提是B、C的結果在A系統中不會使用到

(3)、削峰:
場景分析:
在高峰期的時候,系統每秒的請求量達到5000,那麼呼叫mysql的請求也是5000,一般情況下mysql的請求大概在2000左右,那麼在高峰期的時候,資料庫就被打垮了,那系統就不可用了。
問題解決:
在系統A前面加個MQ,使用者請求先到MQ,系統A從MQ中每秒消費2000條資料,這樣就把本來5000的請求變為mysql可以接受的請求數量了,可以保證系統不掛掉,可以繼續提供服務。MQ裡的資料可以慢慢的把它消費掉

2、訊息佇列有什麼缺點?

面試官心理剖析:
主要是想了解你知不知道MQ的缺點,如果不知道缺點就引入這個框架,那就是挖坑。

回答:
(1)、系統可用性降低:因為引入了MQ,如果MQ掛了,那MQ下流的系統就不可用。
(2)、系統複雜性提高:怎麼保證訊息不會被重複消費?訊息丟失了怎麼辦?如何保證訊息的順序性?(你可以根據自己遇到的問題都說一下,儘量說一下你熟悉的,因為面試官會根據你說的問題繼續提問)
(3)、一致性問題:如果MQ消費端其中一個系統掛了,怎麼辦?

注意:這裡回答的時候儘量選擇自己熟悉的場景。面試官肯定會問你那你們是怎麼解決的?如果你說不上來那不是給自己挖坑嘛。

個人總結:

中小型公司,技術一般,可以考慮用RabbitMQ;
大型公司,基礎架構研發實力較強,用RocketMQ是很好的選擇
實時計算、日誌採集:使用kafka;

參考http://www.wityx.com