成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

到底什么時候該使用MQ?

開發 開發工具
最近分享了幾篇MQ相關的文章,不少網友詢問,究竟什么時候使用MQ,MQ究竟適合什么場景,于是我就寫了這篇文章。

[[187583]]

一、緣起

一切脫離業務的架構設計與新技術引入都是耍流氓。

引入一個技術之前,首先應該解答的問題是,這個技術解決什么問題。

就像微服務分層架構之前,應該首先回答,為什么要引入微服務,微服務究竟解決什么問題(詳見《互聯網架構為什么要做微服務?》)。

最近分享了幾篇MQ相關的文章:

不少網友詢問,究竟什么時候使用MQ,MQ究竟適合什么場景,故有了此文。

二、MQ是干嘛的

消息總線(Message Queue),后文稱MQ,是一種跨進程的通信機制,用于上下游傳遞消息。

消息總線(Message Queue)

在互聯網架構中,MQ是一種非常常見的上下游“邏輯解耦+物理解耦”的消息通信服務。

使用了MQ之后,消息發送上游只需要依賴MQ,邏輯上和物理上都不用依賴其他服務。

三、什么時候不使用消息總線

什么時候不使用消息總線

既然MQ是互聯網分層架構中的解耦利器,那所有通訊都使用MQ豈不是很好?這是一個嚴重的誤區,調用與被調用的關系,是無法被MQ取代的。

MQ的不足是:

  • 系統更復雜,多了一個MQ組件
  • 消息傳遞路徑更長,延時會增加
  • 消息可靠性和重復性互為矛盾,消息不丟不重難以同時保證
  • 上游無法知道下游的執行結果,這一點是很致命的

舉個栗子:用戶登錄場景,登錄頁面調用passport服務,passport服務的執行結果直接影響登錄結果,此處的“登錄頁面”與“passport服務”就必須使用調用關系,而不能使用MQ通信。

無論如何,記住這個結論:調用方實時依賴執行結果的業務場景,請使用調用,而不是MQ。

四、什么時候使用MQ

【典型場景一:數據驅動的任務依賴】

什么是任務依賴,舉個栗子,互聯網公司經常在凌晨進行一些數據統計任務,這些任務之間有一定的依賴關系,比如:

  • task3需要使用task2的輸出作為輸入
  • task2需要使用task1的輸出作為輸入

這樣的話,tast1, task2, task3之間就有任務依賴關系,必須task1先執行,再task2執行,載task3執行。

數據驅動的任務依賴

對于這類需求,常見的實現方式是,使用cron人工排執行時間表:

  • task1,0:00執行,經驗執行時間為50分鐘
  • task2,1:00執行(為task1預留10分鐘buffer),經驗執行時間也是50分鐘
  • task3,2:00執行(為task2預留10分鐘buffer)

這種方法的壞處是:

  • 如果有一個任務執行時間超過了預留buffer的時間,將會得到錯誤的結果,因為后置任務不清楚前置任務是否執行成功,此時要手動重跑任務,還有可能要調整排班表
  • 總任務的執行時間很長,總是要預留很多buffer,如果前置任務提前完成,后置任務不會提前開始
  • 如果一個任務被多個任務依賴,這個任務將會稱為關鍵路徑,排班表很難體現依賴關系,容易出錯
  • 如果有一個任務的執行時間要調整,將會有多個任務的執行時間要調整

無論如何,采用“cron排班表”的方法,各任務耦合,誰用過誰痛誰知道(采用此法的請評論留言)

優化方案是,采用MQ解耦:

  • task1準時開始,結束后發一個“task1 done”的消息
  • task2訂閱“task1 done”的消息,收到消息后第一時間啟動執行,結束后發一個“task2 done”的消息
  • task3同理

采用MQ的優點是:

  • 不需要預留buffer,上游任務執行完,下游任務總會在第一時間被執行
  • 依賴多個任務,被多個任務依賴都很好處理,只需要訂閱相關消息即可
  • 有任務執行時間變化,下游任務都不需要調整執行時間

需要特別說明的是,MQ只用來傳遞上游任務執行完成的消息,并不用于傳遞真正的輸入輸出數據。

【典型場景二:上游不關心執行結果】

上游需要關注執行結果時要用“調用”,上游不關注執行結果時,就可以使用MQ了。

舉個栗子,58同城的很多下游需要關注“用戶發布帖子”這個事件,比如招聘用戶發布帖子后,招聘業務要獎勵58豆,房產用戶發布帖子后,房產業務要送2個置頂,二手用戶發布帖子后,二手業務要修改用戶統計數據。

對于這類需求,常見的實現方式是,使用調用關系:

帖子發布服務執行完成之后,調用下游招聘業務、房產業務、二手業務,來完成消息的通知,但事實上,這個通知是否正常正確的執行,帖子發布服務根本不關注。

這種方法的壞處是:

  • 帖子發布流程的執行時間增加了
  • 下游服務當機,可能導致帖子發布服務受影響,上下游邏輯+物理依賴嚴重
  • 每當增加一個需要知道“帖子發布成功”信息的下游,修改代碼的是帖子發布服務,這一點是最惡心的,屬于架構設計中典型的依賴倒轉,誰用過誰痛誰知道(采用此法的請評論留言)

優化方案是,采用MQ解耦:

  • 帖子發布成功后,向MQ發一個消息
  • 哪個下游關注“帖子發布成功”的消息,主動去MQ訂閱

采用MQ的優點是:

  • 上游執行時間短
  • 上下游邏輯+物理解耦,除了與MQ有物理連接,模塊之間都不相互依賴
  • 新增一個下游消息關注方,上游不需要修改任何代碼

典型場景三:上游關注執行結果,但執行時間很長

有時候上游需要關注執行結果,但執行結果時間很長(典型的是調用離線處理,或者跨公網調用),也經常使用回調網關+MQ來解耦。

舉個栗子,微信支付,跨公網調用微信的接口,執行時間會比較長,但調用方又非常關注執行結果,此時一般怎么玩呢?

一般采用“回調網關+MQ”方案來解耦:

  • 調用方直接跨公網調用微信接口
  • 微信返回調用成功,此時并不代表返回成功
  • 微信執行完成后,回調統一網關
  • 網關將返回結果通知MQ
  • 請求方收到結果通知

這里需要注意的是,不應該由回調網關來調用上游來通知結果,如果是這樣的話,每次新增調用方,回調網關都需要修改代碼,仍然會反向依賴,使用回調網關+MQ的方案,新增任何對微信支付的調用,都不需要修改代碼啦。

五、總結

MQ是一個互聯網架構中常見的解耦利器。

什么時候不使用MQ?

  • 上游實時關注執行結果

什么時候使用MQ?

  • 數據驅動的任務依賴
  • 上游不關心多下游執行結果
  • 異步返回執行時間長

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2020-01-05 23:28:51

MQ消息進程

2024-08-05 01:22:16

2025-02-28 09:04:08

2020-06-17 10:35:16

機器學習AI人工智能

2020-10-25 07:49:37

React組件

2020-10-27 09:50:06

Reactrende前端

2025-05-15 08:50:00

MQRPC架構

2014-09-23 10:16:03

程序員

2022-05-19 10:27:34

機器學習人工智能

2017-06-28 15:06:51

PythonLambda函數

2013-04-25 10:28:38

大數據云服務

2014-09-17 10:57:22

802.11acWLAN

2012-07-26 10:27:31

PHP

2020-05-12 11:25:50

MySQLES數據庫

2017-05-15 09:55:07

2015-07-08 15:55:01

NSStringcopystrong

2013-09-29 17:13:59

PowerShell工作流

2013-11-28 16:03:24

2012-09-24 10:20:39

JavaScriptJS

2020-07-24 09:20:44

MapObject前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美伊人久久久久久久久影院 | 狠狠色综合欧美激情 | 国产高清精品一区二区三区 | 免费观看黄网站 | 精品亚洲一区二区三区四区五区 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 亚洲精品一区av在线播放 | 国产精品99久久久久久人 | 91亚洲国产成人久久精品网站 | 永久av| 亚洲第一免费播放区 | 亚洲美女网站 | 综合一区二区三区 | 91在线网站 | 91porn国产成人福利 | 日韩av大片免费看 | 久久精品国产一区二区三区不卡 | 九色网址| 91高清在线视频 | 亚洲高清视频在线观看 | 日韩精品999 | 日韩福利| 欧美一区二区三区国产 | 色接久久| 日韩爱爱网 | 久久综合一区二区 | 欧美一区二区大片 | 91综合网 | 欧美三级电影在线播放 | 亚洲一区不卡在线 | 黄色在线免费播放 | 日韩成人精品一区二区三区 | 国产精品一区二区免费看 | 久久麻豆精品 | 亚洲精品久久久 | 国产一级视频在线观看 | 91精品国产自产精品男人的天堂 | 99精品国产一区二区三区 | 中文字幕不卡一区 | 美女福利网站 | a毛片 |