MQ之何時使用

一、MQ是干嘛的

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


在互聯(lián)網架構中窟感,MQ是一種非常常見的上下游“邏輯解耦+物理解耦”的消息通信服務讨彼。

使用了MQ之后,消息發(fā)送上游只需要依賴MQ柿祈,邏輯上和物理上都不用依賴其他服務哈误。

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


既然MQ是互聯(lián)網分層架構中的解耦利器躏嚎,那所有通訊都使用MQ豈不是很好黑滴?

這是一個嚴重的誤區(qū)

,調用與被調用的關系紧索,是無法被MQ取代的。

MQ的不足是:

1)系統(tǒng)更復雜菜谣,多了一個MQ組件

2)消息傳遞路徑更長珠漂,延時會增加

3)消息可靠性和重復性互為矛盾,消息不丟不重難以同時保證

4)上游無法知道下游的執(zhí)行結果尾膊,這一點是很致命的

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

無論如何抓谴,記住這個結論調用方實時依賴執(zhí)行結果的業(yè)務場景暮蹂,請使用調用寞缝,而不是MQ

三仰泻、什么時候使用MQ

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

什么是任務依賴荆陆,舉個栗子,互聯(lián)網公司經常在凌晨進行一些數據統(tǒng)計任務集侯,這些任務之間有一定的依賴關系被啼,比如:

1)task3需要使用task2的輸出作為輸入

2)task2需要使用task1的輸出作為輸入

這樣的話,tast1, task2, task3之間就有任務依賴關系棠枉,必須task1先執(zhí)行浓体,再task2執(zhí)行,載task3執(zhí)行辈讶。


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

1)task1荞估,0:00執(zhí)行咳促,經驗執(zhí)行時間為50分鐘

2)task2,1:00執(zhí)行(為task1預留10分鐘buffer)勘伺,經驗執(zhí)行時間也是50分鐘

3)task3跪腹,2:00執(zhí)行(為task2預留10分鐘buffer)

這種方法的壞處是:

1)如果有一個任務執(zhí)行時間超過了預留buffer的時間,將會得到錯誤的結果飞醉,因為后置任務不清楚前置任務是否執(zhí)行成功冲茸,此時要手動重跑任務,還有可能要調整排班表

2)總任務的執(zhí)行時間很長缅帘,總是要預留很多buffer轴术,如果前置任務提前完成,后置任務不會提前開始

3)如果一個任務被多個任務依賴钦无,這個任務將會稱為關鍵路徑逗栽,排班表很難體現依賴關系,容易出錯

4)如果有一個任務的執(zhí)行時間要調整失暂,將會有多個任務的執(zhí)行時間要調整

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


優(yōu)化方案是凭峡,采用MQ解耦:

1)task1準時開始,結束后發(fā)一個“task1 done”的消息

2)task2訂閱“task1 done”的消息决记,收到消息后第一時間啟動執(zhí)行摧冀,結束后發(fā)一個“task2 done”的消息

3)task3同理

采用MQ的優(yōu)點是:

1)不需要預留buffer,上游任務執(zhí)行完,下游任務總會在第一時間被執(zhí)行

2)依賴多個任務索昂,被多個任務依賴都很好處理建车,只需要訂閱相關消息即可

3)有任務執(zhí)行時間變化,下游任務都不需要調整執(zhí)行時間

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

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

上游需要關注執(zhí)行結果時要用“調用”框产,上游不關注執(zhí)行結果時凄杯,就可以使用MQ了。

舉個栗子秉宿,58同城的很多下游需要關注“用戶發(fā)布帖子”這個事件戒突,比如招聘用戶發(fā)布帖子后,招聘業(yè)務要獎勵58豆描睦,房產用戶發(fā)布帖子后膊存,房產業(yè)務要送2個置頂,二手用戶發(fā)布帖子后忱叭,二手業(yè)務要修改用戶統(tǒng)計數據隔崎。


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

帖子發(fā)布服務執(zhí)行完成之后爵卒,調用下游招聘業(yè)務、房產業(yè)務撵彻、二手業(yè)務钓株,來完成消息的通知,但事實上陌僵,這個通知是否正常正確的執(zhí)行轴合,帖子發(fā)布服務根本不關注。

這種方法的壞處是:

1)帖子發(fā)布流程的執(zhí)行時間增加了

2)下游服務當機碗短,可能導致帖子發(fā)布服務受影響受葛,上下游邏輯+物理依賴嚴重

3)每當增加一個需要知道“帖子發(fā)布成功”信息的下游,修改代碼的是帖子發(fā)布服務偎谁,這一點是最惡心的总滩,屬于架構設計中典型的依賴倒轉,誰用過誰痛誰知道(采用此法的請評論留言)


優(yōu)化方案是搭盾,采用MQ解耦:

1)帖子發(fā)布成功后,向MQ發(fā)一個消息

2)哪個下游關注“帖子發(fā)布成功”的消息婉支,主動去MQ訂閱

采用MQ的優(yōu)點是:

1)上游執(zhí)行時間短

2)上下游邏輯+物理解耦鸯隅,除了與MQ有物理連接,模塊之間都不相互依賴

3)新增一個下游消息關注方,上游不需要修改任何代碼

典型場景三:上游關注執(zhí)行結果蝌以,但執(zhí)行時間很長

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

舉個栗子,微信支付徊件,跨公網調用微信的接口奸攻,執(zhí)行時間會比較長,但調用方又非常關注執(zhí)行結果虱痕,此時一般怎么玩呢睹耐?


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

1)調用方直接跨公網調用微信接口

2)微信返回調用成功,此時并不代表返回成功

3)微信執(zhí)行完成后部翘,回調統(tǒng)一網關

4)網關將返回結果通知MQ

5)請求方收到結果通知

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

四彰导、總結

MQ是一個互聯(lián)網架構中常見的解耦利器。

什么時候不使用MQ敲茄?

上游實時關注執(zhí)行結果

什么時候使用MQ位谋?

1)數據驅動的任務依賴

2)上游不關心多下游執(zhí)行結果

3)異步返回執(zhí)行時間長

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市堰燎,隨后出現的幾起案子掏父,更是在濱河造成了極大的恐慌,老刑警劉巖秆剪,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赊淑,死亡現場離奇詭異,居然都是意外死亡仅讽,警方通過查閱死者的電腦和手機陶缺,發(fā)現死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洁灵,“玉大人饱岸,你說我怎么就攤上這事掺出。” “怎么了苫费?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵汤锨,是天一觀的道長。 經常有香客問我百框,道長闲礼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任铐维,我火速辦了婚禮柬泽,結果婚禮上,老公的妹妹穿的比我還像新娘方椎。我一直安慰自己聂抢,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布棠众。 她就那樣靜靜地躺著琳疏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闸拿。 梳的紋絲不亂的頭發(fā)上空盼,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音新荤,去河邊找鬼揽趾。 笑死,一個胖子當著我的面吹牛苛骨,可吹牛的內容都是我干的篱瞎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼痒芝,長吁一口氣:“原來是場噩夢啊……” “哼俐筋!你這毒婦竟也來了?” 一聲冷哼從身側響起严衬,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤澄者,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后请琳,有當地人在樹林里發(fā)現了一具尸體粱挡,經...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年俄精,在試婚紗的時候發(fā)現自己被綠了询筏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡竖慧,死狀恐怖嫌套,靈堂內的尸體忽然破棺而出局冰,到底是詐尸還是另有隱情,我是刑警寧澤灌危,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站碳胳,受9級特大地震影響勇蝙,放射性物質發(fā)生泄漏。R本人自食惡果不足惜挨约,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一味混、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诫惭,春花似錦翁锡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至怨绣,卻和暖如春角溃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篮撑。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工减细, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赢笨。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓未蝌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親茧妒。 傳聞我的和親對象是個殘疾皇子萧吠,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容

  • 消息隊列的引入,什么時候使用MQ嘶伟? MQ(Message Queue)怎憋,一種跨進程的通信機制,用于上下游傳遞消息九昧。...
    聯(lián)想橋南閱讀 16,399評論 0 3
  • 一绊袋、前言 上一篇文章iOS多線程淺匯-原理篇中整理了一些有關多線程的基本概念。本篇博文介紹的是iOS中常用的幾個多...
    nuclear閱讀 2,046評論 6 18
  • “ 消息隊列已經逐漸成為企業(yè)IT系統(tǒng)內部通信的核心手段铸鹰。它具有低耦合癌别、可靠投遞、廣播蹋笼、流量控制展姐、最終一致性等一系列...
    落羽成霜丶閱讀 3,981評論 1 41
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理躁垛,服務發(fā)現,斷路器圾笨,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 1.工作‘ 2016年我在J公司待了一年教馆,在滿1年的時候離職,這份工作是上海最大的輔導機構擂达,主要做文化課的輔導土铺,經...
    小蘇慢慢來閱讀 110評論 0 0