其實面試官主要是想看看:
為什麼使用訊息佇列?
其實就是想知道是因為什麼原因引入的mq技術,為了解決哪些問題。面試官期望的回答就是,當初你們公司有乙個什麼樣的業務場景,這個場景有什麼樣的技術挑戰,不用mq可能會有麻煩,現在引入mq帶來了哪些好處。
通過mq的好處是:解耦,非同步,削峰。
解耦這個場景通常是發布訂閱模式,比如:系統a要給系統b、c、d傳送訊息。如果這時候新加入乙個系統e,則需要更改系統a的**才能給系統e傳送訊息,如果使用mq,可以將生產者和消費者解耦。
總結:通過乙個mq,實現pub/sub發布訂閱模式這麼乙個模型,就實現了系統解耦。
面試技巧:你需要去考慮一下自己的系統中是否有類似的場景,就是乙個模組呼叫了其他多個模組,彼此維護起來很麻煩。但是這個呼叫其實是不需要同步呼叫的。如果使用mq進行非同步解耦,也是可以的。在簡歷中進行體現出來,使用mq進行解耦。
非同步如果系統a接收到乙個請求,自己本地寫庫需要100ms,同時需要呼叫系統b耗費200ms,系統c耗費100ms,系統d耗費300ms。總的耗時則為700ms,這在網際網路專案中是可以忍受的。使用mq將呼叫非同步話,這樣系統a幾乎只需要100ms就可以返回。
削峰系統平時qps大概50左右,但是遇到突發情況時,qps飆公升至5000,如果系統的資料請求是直接基於mysql的,那麼mysql可能會崩潰。一般的mysql的tps大概在2k左右。瞬間的高峰,可能會使系統出現雪崩。
如果使用了mq,在高峰的時候將資料寫入到mq中,消費端根據自己的承受能力去消費即可,不會因為請求壓力過大導致崩潰。再到系統空閒時間,去消費掉擠壓的資料。
這個短暫的擠壓是被允許的,因為當高峰期過去之後,系統會很快的消費掉擠壓的資料。
訊息佇列有什麼缺點?
優點已經說過了,在特殊場景下有其對應的好處:解耦、非同步、削峰。
缺點主要有以下三個:
所以訊息佇列是一種非常複雜的架構,引入它會帶來一些好處,但是如果由於沒有考慮到處,同時也會出現一系列的問題。但是有些場景下,該用還是要用的,如何規避掉風險需要清楚。
kafka、activemq、rabbitmq、rocketmq有什麼優缺點?
特性activemq
rabbitmq
rocketmq
kafka
單機吞吐量
萬級,比rocketmq、kafka低乙個數量級
同activemq
10萬級別,支撐高吞吐量
10萬級,高吞吐,一般配合大資料類的系統來進行實時資料計算、日誌採集等場景
topic數量對吞吐量對影響
topic可以達到幾百/幾千級別,吞吐量會有較小幅度的下降,這是rocketmq的一大優勢,在同等機器下,可以支撐大量的topic
topic從幾十到幾百的時候,吞吐量會大幅度下降,使用kafka要保證topic不要過多
時效性ms級
微秒級,這是rabbitmq的一大特點,延遲最低
ms級延遲在ms以內
可用性高,基於主從架構
同activemq
非常高,分布式架構
非常高,分布式架構,乙個節點宕機不會影響其他節點
訊息可靠性
有小概率丟失
基本不丟失
可以通過配置做到0丟失
同rocketmq
功能支援
mq領域的功能及其完備
基於erlang開發,併發能力很強,效能極好,延時很低
mq功能較為完善,還是分布式架構,擴充套件性好
功能較為簡單,主要支援簡單的mq功能,在大資料領域的實時計算以及日誌採集被大規模使用
綜上,各種對比之後,有如下建議:
中小企業建議使用rabbitmq,有豐富的管理介面,開箱即用,穩定性好。
有自研能力的企業,可以使用rocketmq,支撐高吞吐。
有大資料相關業務的,可以直接使用kafka,畢竟kafka在大資料領域已經是事實標準。
面試常問題 為什麼要使用MQ訊息中間
在面試大型網際網路公司的時候,很可能會被問到訊息佇列的問題 1.在何種場景下使用了訊息中介軟體?2.為什麼要在系統裡引入訊息中介軟體?3.如何實現冪等?鏈式呼叫是我們在寫程式時候的一般流程,為了完成乙個整體功能,會將其拆分成多個函式 或子模組 比如模組a呼叫模組b,模組b呼叫模組c,模組c呼叫模組d...
為什麼要使用訊息佇列
參考 訊息佇列本身有確認訊息被正確消費的機制 4.2message acknowledgment訊息確認 為了保證資料不被丟失,rabbitmq支援訊息確認機制,為了保證資料能被正確處理而不僅僅是被consumer收到,那麼我們不能採用no ack,而應該是在處理完資料之後傳送ack.在處理完資料之...
為什麼要使用訊息佇列?
在實際的專案實踐中,訊息佇列有的使用還是比較常用的,有時在想訊息佇列的好處是什麼,使用mq能帶來什麼好處。在說之前,目前市場主流的幾種mq activemq,rabbitmq,rocketmq,kafka 關於mq的入門就不說了,可以找下教程,寫個demo測試一下就好了,還是比較簡單的。先上張圖了解...