mq的做用
- 經過異步方式對系統解耦
- 增長系統的併發處理能力
經過異步方式對系統解耦
以用戶註冊爲例,通常狀況下:
數據庫
分下一下,上面過程存在的一些問題:併發
- 註冊過程會調用4個服務(註冊服務、郵件服務、短信服務、積分服務),服務之間依賴性太強,任何一個服務不可用,直接影響整個註冊業務
- 接口耗時太長,每一個服務耗時100ms,註冊流程耗時400ms
- 對用戶來講,用戶信息入庫是主要的業務流程,其餘並非響應用戶過程當中直接關注的邏輯,能夠異步進行處理
採用mq的方式實現:
異步
過程:性能
- 調用註冊服務,註冊信息入庫,耗時100ms
- 投遞註冊消息到mq
- 返回註冊成功
- 對於用戶來講耗時200ms
- 其餘3個操做(發郵件、發短信、增長積分)從消息隊列中拉取消息進行處理,對於主流程來講是異步操做
將依賴於3個服務轉換爲只依賴於mq服務,只須要保證註冊服務、mq服務高可用,便可以保證註冊服務的高可用,相比保證其餘3個服務高可用上容易了許多。日誌
增長系統的併發處理能力
以電商中的秒殺場景爲例,採用同步處理:blog
- 用戶點擊秒殺
- 調用訂單服務,驗證庫存、鎖定庫存
- 跳轉到支付頁面進行支付
分析一下,存在的問題:接口
你們都有在銀行辦理業務的經驗,銀行處理業務的流程:領號、排隊、等待叫號辦理業務。同步
秒殺中咱們也能夠參考銀行辦理業務的流程:
- 用戶點擊描述
- 系統接受到用戶請求後,生成一個惟一的編號,而後投遞一條消息(秒殺下單)到mq
- 響應用戶:秒殺正在處理中
- 秒殺系統從mq中拉取消息進行處理,處理完成以後告知用戶,這步操做對於用戶來講是異步處理的過程
從上面能夠看出,從接受用戶請求到響應用戶請求,未訪問數據庫,只有生成編號和發送消息的操做,這部分處理速度是很是快的,不存在性能的問題,數據庫也不存在壓力的問題了,全部用戶的請求都被做爲一條消息投遞到mq進行異步處理;從而解決了秒殺中同步處理遇到的各類問題。
其餘一些使用場景
- 系統日誌的處理
系統手機日誌,異步發送到mq,日誌服務隊從mq中拉取消息進行各類處理,關於這個之後咱們會專門討論。
- 經過事件驅動的一些業務,也可使用mq實現
總結
- mq是採用異步的方式來解決系統耦合性的問題,併發處理的問題;重點是在於異步,那麼什麼狀況下使用異步呢?當調用方不強依賴於被調用方的結果的時候,能夠採用異步的方式進行處理,此時可使用mq。
- 當調用方強依賴於被調用方的結果的時候,須要使用同步的方式,不能使用mq
mq系列整個內容,咱們將討論:
- mq的使用場景
- 業務系統中投遞消息的幾種方式?
- 如何確保投遞消息必定成功?
- 消息消費的幾種方式
- 如何確保消息至少消費一次
- 如何保證消息消費的冪等性