掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
一、緣起

創(chuàng)新互聯(lián)成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元寶山做網(wǎng)站,已為上家服務(wù),為寶山各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
一切脫離業(yè)務(wù)的架構(gòu)設(shè)計(jì)與新技術(shù)引入都是耍流氓。
引入一個(gè)技術(shù)之前,首先應(yīng)該解答的問題是,這個(gè)技術(shù)解決什么問題。
就像微服務(wù)分層架構(gòu)之前,應(yīng)該首先回答,為什么要引入微服務(wù),微服務(wù)究竟解決什么問題(詳見《互聯(lián)網(wǎng)架構(gòu)為什么要做微服務(wù)?》)。
最近分享了幾篇MQ相關(guān)的文章:
不少網(wǎng)友詢問,究竟什么時(shí)候使用MQ,MQ究竟適合什么場景,故有了此文。
二、MQ是干嘛的
消息總線(Message Queue),后文稱MQ,是一種跨進(jìn)程的通信機(jī)制,用于上下游傳遞消息。
在互聯(lián)網(wǎng)架構(gòu)中,MQ是一種非常常見的上下游“邏輯解耦+物理解耦”的消息通信服務(wù)。
使用了MQ之后,消息發(fā)送上游只需要依賴MQ,邏輯上和物理上都不用依賴其他服務(wù)。
三、什么時(shí)候不使用消息總線
既然MQ是互聯(lián)網(wǎng)分層架構(gòu)中的解耦利器,那所有通訊都使用MQ豈不是很好?這是一個(gè)嚴(yán)重的誤區(qū),調(diào)用與被調(diào)用的關(guān)系,是無法被MQ取代的。
MQ的不足是:
舉個(gè)栗子:用戶登錄場景,登錄頁面調(diào)用passport服務(wù),passport服務(wù)的執(zhí)行結(jié)果直接影響登錄結(jié)果,此處的“登錄頁面”與“passport服務(wù)”就必須使用調(diào)用關(guān)系,而不能使用MQ通信。
無論如何,記住這個(gè)結(jié)論:調(diào)用方實(shí)時(shí)依賴執(zhí)行結(jié)果的業(yè)務(wù)場景,請(qǐng)使用調(diào)用,而不是MQ。
四、什么時(shí)候使用MQ
【典型場景一:數(shù)據(jù)驅(qū)動(dòng)的任務(wù)依賴】
什么是任務(wù)依賴,舉個(gè)栗子,互聯(lián)網(wǎng)公司經(jīng)常在凌晨進(jìn)行一些數(shù)據(jù)統(tǒng)計(jì)任務(wù),這些任務(wù)之間有一定的依賴關(guān)系,比如:
這樣的話,tast1, task2, task3之間就有任務(wù)依賴關(guān)系,必須task1先執(zhí)行,再task2執(zhí)行,載task3執(zhí)行。
對(duì)于這類需求,常見的實(shí)現(xiàn)方式是,使用cron人工排執(zhí)行時(shí)間表:
這種方法的壞處是:
無論如何,采用“cron排班表”的方法,各任務(wù)耦合,誰用過誰痛誰知道(采用此法的請(qǐng)?jiān)u論留言)
優(yōu)化方案是,采用MQ解耦:
采用MQ的優(yōu)點(diǎn)是:
需要特別說明的是,MQ只用來傳遞上游任務(wù)執(zhí)行完成的消息,并不用于傳遞真正的輸入輸出數(shù)據(jù)。
【典型場景二:上游不關(guān)心執(zhí)行結(jié)果】
上游需要關(guān)注執(zhí)行結(jié)果時(shí)要用“調(diào)用”,上游不關(guān)注執(zhí)行結(jié)果時(shí),就可以使用MQ了。
舉個(gè)栗子,58同城的很多下游需要關(guān)注“用戶發(fā)布帖子”這個(gè)事件,比如招聘用戶發(fā)布帖子后,招聘業(yè)務(wù)要獎(jiǎng)勵(lì)58豆,房產(chǎn)用戶發(fā)布帖子后,房產(chǎn)業(yè)務(wù)要送2個(gè)置頂,二手用戶發(fā)布帖子后,二手業(yè)務(wù)要修改用戶統(tǒng)計(jì)數(shù)據(jù)。
對(duì)于這類需求,常見的實(shí)現(xiàn)方式是,使用調(diào)用關(guān)系:
帖子發(fā)布服務(wù)執(zhí)行完成之后,調(diào)用下游招聘業(yè)務(wù)、房產(chǎn)業(yè)務(wù)、二手業(yè)務(wù),來完成消息的通知,但事實(shí)上,這個(gè)通知是否正常正確的執(zhí)行,帖子發(fā)布服務(wù)根本不關(guān)注。
這種方法的壞處是:
優(yōu)化方案是,采用MQ解耦:
采用MQ的優(yōu)點(diǎn)是:
典型場景三:上游關(guān)注執(zhí)行結(jié)果,但執(zhí)行時(shí)間很長
有時(shí)候上游需要關(guān)注執(zhí)行結(jié)果,但執(zhí)行結(jié)果時(shí)間很長(典型的是調(diào)用離線處理,或者跨公網(wǎng)調(diào)用),也經(jīng)常使用回調(diào)網(wǎng)關(guān)+MQ來解耦。
舉個(gè)栗子,微信支付,跨公網(wǎng)調(diào)用微信的接口,執(zhí)行時(shí)間會(huì)比較長,但調(diào)用方又非常關(guān)注執(zhí)行結(jié)果,此時(shí)一般怎么玩呢?
一般采用“回調(diào)網(wǎng)關(guān)+MQ”方案來解耦:
這里需要注意的是,不應(yīng)該由回調(diào)網(wǎng)關(guān)來調(diào)用上游來通知結(jié)果,如果是這樣的話,每次新增調(diào)用方,回調(diào)網(wǎng)關(guān)都需要修改代碼,仍然會(huì)反向依賴,使用回調(diào)網(wǎng)關(guān)+MQ的方案,新增任何對(duì)微信支付的調(diào)用,都不需要修改代碼啦。
五、總結(jié)
MQ是一個(gè)互聯(lián)網(wǎng)架構(gòu)中常見的解耦利器。
什么時(shí)候不使用MQ?
什么時(shí)候使用MQ?
【本文為專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流