面試連環炮
- 你用過消息隊列麼?
- 說說你們項目裏是怎麼用消息隊列的?
- 我們有一個訂單系統,訂單系統會每次下一個新訂單的時候,就會發送一條消息到ActiveMQ裏面去,後臺有一個庫存系統,負責獲取消息,然後更新庫存。
- 爲什麼使用消息隊列?
- 你的訂單系統不發送消息到MQ,而是直接調用庫存系統的一個接口,然後直接調用成功了,庫存也更新了,那就不需要使用消息隊列了呀
- 使用消息隊列的主要作用是:異步、解耦、削峯
- 消息隊列都有什麼優缺點?
- Kafka、activeMQ、RibbitMQ、RocketMQ都有什麼優缺點?
- 如何保證消息隊列的高可用?
- 如何保證消息不被重複消費?如何保證消息消費時的冪等性?
- 如何保證消息的可靠性傳輸,要是消息丟失了怎麼辦?
- 如何保證消息的順序性?
- 如何解決消息隊列的延時以及過期失效問題?消息隊列滿了以後該怎麼處理?有幾百萬消息持續積壓幾小時,說說怎麼解決?
- 如果讓你寫一個消息隊列,該如何進行架構設計,說一下你的思路?
優點上面已經說了:解耦、異步、削峯,缺點呢?顯而易見的
- 系統可用性降低:系統引入的外部依賴越多,越容易掛掉,本來你就是A系統調用BCD三個系統接口就好了,人家ABCD四個系統好好的,沒啥問題,這個時候卻加入了MQ進來,萬一MQ掛了怎麼辦?MQ掛了整套系統也會崩潰了。
- 系統複雜性提高:硬生生加個MQ進來,你怎麼保證消息沒有重複消費?怎麼處理消息丟失的情況?怎麼保證消息傳遞的順序性?
- 一致性問題:A系統處理完了直接返回成功了,人都以爲你的請求成功了,但是問題是,要在BCD三個系統中,BD兩個系統寫庫成功了,結果C系統寫庫失敗了,這樣就會存在數據不一致的問題。
- 所以說消息隊列實際上是一種複雜的架構,你引入它有好多好處,但是也得針對它帶來的壞處做各種額外的技術方案和架構來規避掉,最後發現系統複雜性提升了一個數量級,也許是複雜10倍,但是關鍵時刻,用還是得用。