消息隊列--靈魂拷問(1)

消息隊列的使用場景

消息隊列的做用主要有三個解耦、異步、削峯sql

解耦

B,C,D 系統須要使用 A 系統產生的關鍵數據。

無消息隊列時系統 A 爲系統 B、C、D 等提供各自的接口,致使系統 A 與它們緊密耦合添加系統 E 又須要接口,刪除 B 系統原接口又沒用了
有消息隊列時系統 A 做爲生產者,將消息發送到消息隊列系統 B、C、D 做爲消費者訂閱消息新增消費者只需訂閱消息,對原系統和業務沒有影響

異步

用戶請求數據時,系統的響應時間是保證用戶體驗很重要的一部分。

無消息隊列時用戶請求 A 系統,A 系統須要等待 BCD 執行完成以後響應用戶收到響應用時近 1 秒
用消息隊列時用戶請求 A 系統,A 系統將請求推到消息隊列中,B、C、D 異步執行用戶收到響應用時 200 毫秒

肖鋒

秒殺場景下,每秒有 5000 個請求,Mysql 每秒最大處理 2000 條 sql。

無消息隊列時用戶請求數據直接寫入數據庫,高併發時數據庫壓力劇增,甚至奔潰Mysql 宕機,整個系統都不能用了
有消息隊列時系統 B、C、D用戶請求數據先存入 MQ 中系統 A 每秒讀取 2000 條數據進行處理每秒多出 3000 條未處理數據按場景稍後處理

消息隊列有什麼缺點

系統可用性下降數據庫

  • 系統引入的外部依賴越多,宕機的可能性就越大
  • 系統引入消息隊列,就要考慮消息隊列的可靠性
  • 好比本來只須要考慮 A,B,C,D 四個系統
  • 引入消息隊列以後就須要考慮 A,B,C,D 四個系統外加消息隊列

系統複雜度提升併發

  • 消息重複消費問題
  • 消息丟失問題
  • 消息傳遞順序問題

一致性問題異步

  • A 系統處理完返回成功,即認爲請求成功
  • 可是也存在 BC 系統寫入成功,而 D 系統寫入失敗的狀況
  • 這樣的狀況就是數據不一致
相關文章
相關標籤/搜索