聊聊mq的使用場景


mq的作用

  1. 通過異步方式對系統解耦
  2. 增加系統的並發處理能力

通過異步方式對系統解耦

以用戶注冊為例,一般情況下:

分下一下,上面過程存在的一些問題:

  1. 注冊過程會調用4個服務(注冊服務、郵件服務、短信服務、積分服務),服務之間依賴性太強,任何一個服務不可用,直接影響整個注冊業務
  2. 接口耗時太長,每個服務耗時100ms,注冊流程耗時400ms
  3. 對用戶來說,用戶信息入庫是主要的業務流程,其他並不是響應用戶過程中直接關注的邏輯,可以異步進行處理

采用mq的方式實現:

過程:

  • 調用注冊服務,注冊信息入庫,耗時100ms
  • 投遞注冊消息到mq
  • 返回注冊成功
  • 對於用戶來說耗時200ms
  • 其他3個操作(發郵件、發短信、增加積分)從消息隊列中拉取消息進行處理,對於主流程來說是異步操作

將依賴於3個服務轉換為只依賴於mq服務,只需要保證注冊服務、mq服務高可用,即可以保證注冊服務的高可用,相比保證其他3個服務高可用上容易了許多。

增加系統的並發處理能力

以電商中的秒殺場景為例,采用同步處理:

  • 用戶點擊秒殺
  • 調用訂單服務,驗證庫存、鎖定庫存
  • 跳轉到支付頁面進行支付

分析一下,存在的問題:

  • 驗證庫存、鎖定庫存會訪問數據庫

  • 秒殺場景,商品數量有限,請求量非常大,每個請求來了都做以上處理,直接會把數據庫壓垮,導致數據庫無法對外提供服務,數據庫的不可用直接導致整個業務的不可用,秒殺活動打水漂。

  • 大量請求會同時到達,同時去訪問數據庫,數據庫連接有限,導致很多請求會處於等待狀態,導致並發性能急劇下降

  • 大量用戶同時操作庫存,存在爭搶數據庫鎖的情況,容易導致死鎖

  • 秒殺中數量一般是有限,大量用戶搶購,其實最終只有很少的用戶能夠搶購到

大家都有在銀行辦理業務的經驗,銀行處理業務的流程:領號、排隊、等待叫號辦理業務

秒殺中我們也可以參考銀行辦理業務的流程:

  • 用戶點擊描述
  • 系統接受到用戶請求后,生成一個唯一的編號,然后投遞一條消息(秒殺下單)到mq
  • 響應用戶:秒殺正在處理中
  • 秒殺系統從mq中拉取消息進行處理,處理完成之后告知用戶,這步操作對於用戶來說是異步處理的過程

從上面可以看出,從接受用戶請求到響應用戶請求,未訪問數據庫,只有生成編號和發送消息的操作,這部分處理速度是非常快的,不存在性能的問題,數據庫也不存在壓力的問題了,所有用戶的請求都被作為一條消息投遞到mq進行異步處理;從而解決了秒殺中同步處理遇到的各種問題。

其他一些使用場景

  1. 系統日志的處理
    系統手機日志,異步發送到mq,日志服務隊從mq中拉取消息進行各種處理,關於這個以后我們會專門討論。
  2. 通過事件驅動的一些業務,也可以使用mq實現

總結

  1. mq是采用異步的方式來解決系統耦合性的問題,並發處理的問題;重點是在於異步,那么什么情況下使用異步呢?當調用方不強依賴於被調用方的結果的時候,可以采用異步的方式進行處理,此時可以使用mq。
  2. 當調用方強依賴於被調用方的結果的時候,需要使用同步的方式,不能使用mq

mq系列整個內容,我們將討論

  1. mq的使用場景
  2. 業務系統中投遞消息的幾種方式?
  3. 如何確保投遞消息一定成功?
  4. 消息消費的幾種方式
  5. 如何確保消息至少消費一次
  6. 如何保證消息消費的冪等性

可以關注公眾號:路人甲Java,獲取年薪50萬課程,獲取最新文章。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM