mq常用的一些使用場景:1. 通過非同步方式對系統解耦;2. 增加系統的併發處理能力;3.系統日誌的處理;4.事件驅動業務的一些場景 ...
mq的作用
- 通過非同步方式對系統解耦
- 增加系統的併發處理能力
通過非同步方式對系統解耦
以用戶註冊為例,一般情況下:
分下一下,上面過程存在的一些問題:
- 註冊過程會調用4個服務(註冊服務、郵件服務、簡訊服務、積分服務),服務之間依賴性太強,任何一個服務不可用,直接影響整個註冊業務
- 介面耗時太長,每個服務耗時100ms,註冊流程耗時400ms
- 對用戶來說,用戶信息入庫是主要的業務流程,其他並不是響應用戶過程中直接關註的邏輯,可以非同步進行處理
採用mq的方式實現:
過程:
- 調用註冊服務,註冊信息入庫,耗時100ms
- 投遞註冊消息到mq
- 返回註冊成功
- 對於用戶來說耗時200ms
- 其他3個操作(發郵件、發簡訊、增加積分)從消息隊列中拉取消息進行處理,對於主流程來說是非同步操作
將依賴於3個服務轉換為只依賴於mq服務,只需要保證註冊服務、mq服務高可用,即可以保證註冊服務的高可用,相比保證其他3個服務高可用上容易了許多。
增加系統的併發處理能力
以電商中的秒殺場景為例,採用同步處理:
- 用戶點擊秒殺
- 調用訂單服務,驗證庫存、鎖定庫存
- 跳轉到支付頁面進行支付
分析一下,存在的問題:
- 驗證庫存、鎖定庫存會訪問資料庫
秒殺場景,商品數量有限,請求量非常大,每個請求來了都做以上處理,直接會把資料庫壓垮,導致資料庫無法對外提供服務,資料庫的不可用直接導致整個業務的不可用,秒殺活動打水漂。
- 大量請求會同時到達,同時去訪問資料庫,資料庫連接有限,導致很多請求會處於等待狀態,導致併發性能急劇下降
- 大量用戶同時操作庫存,存在爭搶資料庫鎖的情況,容易導致死鎖
秒殺中數量一般是有限,大量用戶搶購,其實最終只有很少的用戶能夠搶購到
大家都有在銀行辦理業務的經驗,銀行處理業務的流程:領號、排隊、等待叫號辦理業務。
秒殺中我們也可以參考銀行辦理業務的流程:
- 用戶點擊描述
- 系統接受到用戶請求後,生成一個唯一的編號,然後投遞一條消息(秒殺下單)到mq
- 響應用戶:秒殺正在處理中
- 秒殺系統從mq中拉取消息進行處理,處理完成之後告知用戶,這步操作對於用戶來說是非同步處理的過程
從上面可以看出,從接受用戶請求到響應用戶請求,未訪問資料庫,只有生成編號和發送消息的操作,這部分處理速度是非常快的,不存在性能的問題,資料庫也不存在壓力的問題了,所有用戶的請求都被作為一條消息投遞到mq進行非同步處理;從而解決了秒殺中同步處理遇到的各種問題。
其他一些使用場景
- 系統日誌的處理
系統手機日誌,非同步發送到mq,日誌服務隊從mq中拉取消息進行各種處理,關於這個以後我們會專門討論。 - 通過事件驅動的一些業務,也可以使用mq實現
總結
- mq是採用非同步的方式來解決系統耦合性的問題,併發處理的問題;重點是在於非同步,那麼什麼情況下使用非同步呢?當調用方不強依賴於被調用方的結果的時候,可以採用非同步的方式進行處理,此時可以使用mq。
- 當調用方強依賴於被調用方的結果的時候,需要使用同步的方式,不能使用mq
mq系列整個內容,我們將討論:
- mq的使用場景
- 業務系統中投遞消息的幾種方式?
- 如何確保投遞消息一定成功?
- 消息消費的幾種方式
- 如何確保消息至少消費一次
- 如何保證消息消費的冪等性
路人甲Java,只生產乾貨,公眾號:javacode2018,喜歡的關註一下。