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,獲取年薪50萬課程,獲取最新文章。