面試連環炮
- 你用過消息隊列麼?
- 說說你們項目裏是怎麼用消息隊列的?
- 我們有一個訂單系統,訂單系統會每次下一個新訂單的時候,就會發送一條消息到ActiveMQ裏面去,後臺有一個庫存系統,負責獲取消息,然後更新庫存。
- 爲什麼使用消息隊列?
- 你的訂單系統不發送消息到MQ,而是直接調用庫存系統的一個接口,然後直接調用成功了,庫存也更新了,那就不需要使用消息隊列了呀
- 使用消息隊列的主要作用是:異步、解耦、削峯
- 消息隊列都有什麼優缺點?
- Kafka、activeMQ、RibbitMQ、RocketMQ都有什麼優缺點?
- 如何保證消息隊列的高可用?
- 如何保證消息不被重複消費?如何保證消息消費時的冪等性?
- 如何保證消息的可靠性傳輸,要是消息丟失了怎麼辦?
- 如何保證消息的順序性?
- 如何解決消息隊列的延時以及過期失效問題?消息隊列滿了以後該怎麼處理?有幾百萬消息持續積壓幾小時,說說怎麼解決?
- 如果讓你寫一個消息隊列,該如何進行架構設計,說一下你的思路?
面試題
如何設計一個消息中間件架構?
如果讓你寫一個消息隊列,該如何進行架構設計?說下你的思路
這種問題,說白了,起碼不求你看過那些技術的源碼,但是你應該大概知道那些技術的基本原理,核心組成部分,基本架構個構成,然後參照一些開源技術把一個系統設計出來的思路說一下就好了。
思路
- 首先MQ得支持可伸縮性,那就需要快速擴容,就可以增加吞吐量和容量,可以設計一個分佈式的系統,參考kafka的設計理念,broker - > topic -> partition,每個partition放一臺機器,那就存一部分數據,如果現在資源不夠了,可以給topic增加partition,然後做數據遷移,增加機器,不就可以存放更多的數據,提高更高的吞吐量。
- 其次得考慮一下這個MQ的數據要不要落地磁盤?也就是需不需要保證消息持久化,因爲這樣可以保證數據的不丟失,那落地盤的時候怎麼落?順序寫,這樣沒有磁盤隨機讀寫的尋址開銷,磁盤順序讀的性能是很高的,這就是kafka的思路。
- 其次需要考慮MQ的可用性?這個可以具體到我們上面提到的消息隊列保證高可用,提出了多副本 ,leader 和follower模式,當一個leader宕機的時候,馬上選取一個follower作爲新的leader對外提供服務。
- 需不需要支持數據0丟失?可以參考kafka零丟失方案
其實一個MQ肯定是很複雜的,問這個問題其實是一個開放性問題,主要是想看看有沒有從架構的角度整體構思和設計的思維以及能力
消息隊列相關問題總結
一般而言,如果一個面試官水平還不錯,會沿着從淺入深挖一個點,然後按着這個思路一直問下去,除了這裏的七大問題之後,甚至還能挑着你熟悉的一個MQ一直問到源碼級別,還可能結合項目來仔細問,先講講具體的業務細節,然後將業務跟這些MQ的問題場景結合起來,看看你的每個細節是如何處理和實現的。