MQ 架構與細節
MQ 是什麼?
MQ:MessageQueue,訊息佇列的簡稱,用於程式間通訊或同一程式的不同執行緒間的通訊方式。
什麼時候該使用MQ?
- 資料驅動的任務依賴
- 上游不關心執行結果
- 上游關心執行結果,但執行時間很長
MQ 是架構中常見的解耦利器:實時關注結果的用 RPC,任務依賴、上游不關心執行結果,非同步執行結果返回時間很長,通常可以使用 MQ
MQ 如何做到,訊息必達?
- 訊息落地
- 超時,重傳,確認
MQ 核心架構
MQ 訊息可靠投遞
訊息重傳可能導致收到重複的訊息!
必須要保證訊息冪等!
MQ 如何做到,訊息冪等?
什麼是冪等性?
使用同樣的條件,一次請求和重複多次請求對系統資源的影響是一致的。
對技術方案的啟示是: 分散式系統設計中,設計必須考慮,底層重試時(並不一定是應用層發起的,有時候是TCP 層,有時候是連結池層,有時候是框架層,這些重試,並不是應用層能夠控制的),系統不會異常,資料不會不一致。
MQ 訊息可靠投遞,會不會有冪等性問題?
上半場冪等的關鍵:inner-msg-id
核心是訊息去重
下半場冪等的關鍵:unique-biz-id
業務方通過全域性唯一的業務 id 去自行保證
業務冪等性,需要 MQ 和訊息接收方配合完成!
MQ 如何做到,削峰填谷?
緩衝流量:將 MQ-server 給下游推送訊息,升級為由下游主動去拉取 MQ-Server 裡面的訊息
MQ 如何做到,訊息延時?
訊息延時的業務場景
場景:在一段時間之後,完成一個工作任務
核心資料結構:
- 環形佇列 queue
- 任務集合 Set