到底什麼時候該使用MQ?

2022-05-05 11:09:11 字數 2330 閱讀 8689

mq是幹嘛的

訊息匯流排(message queue),後文稱mq,是一種跨程序的通訊機制,用於上下游傳遞訊息。

在網際網路架構中,mq是一種非常常見的上下游「邏輯解耦+物理解耦」的訊息通訊服務。

使用了mq之後,訊息傳送上游只需要依賴mq,邏輯上和物理上都不用依賴其他服務。

什麼時候不使用訊息匯流排

mq的不足是:

1)系統更複雜,多了乙個mq元件

2)訊息傳遞路徑更長,延時會增加

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

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

舉個栗子:使用者登入場景,登入頁面呼叫passport服務,passport服務的執行結果直接影響登入結果,此處的「登入頁面」與「passport服務」就必須使用呼叫關係,而不能使用mq通訊。

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

什麼時候使用mq

【典型場景一:資料驅動的任務依賴】

什麼是任務依賴,舉個栗子,網際網路公司經常在凌晨進行一些資料統計任務,這些任務之間有一定的依賴關係,比如:

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

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

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

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

1)task1,0:00執行,經驗執行時間為50分鐘

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

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

這種方法的壞處是:

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

2)總任務的執行時間很長,總是要預留很多buffer,如果前置任務提前完成,後置任務不會提前開始

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

4)如果有乙個任務的執行時間要調整,將會有多個任務的執行時間要調整

優化方案是,採用mq解耦:

1)task1準時開始,結束後發乙個「task1 done」的訊息

2)task2訂閱「task1 done」的訊息,收到訊息後第一時間啟動執行,結束後發乙個「task2 done」的訊息

3)task3同理

採用mq的優點是:

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

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

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

需要特別說明的是,mq只用來傳遞上游任務執行完成的訊息,並不用於傳遞真正的輸入輸出資料。

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

上游需要關注執行結果時要用「呼叫」,上游不關注執行結果時,就可以使用mq了。

舉個栗子,58同城的很多下游需要關注「使用者發布帖子」這個事件,比如招聘使用者發布帖子後,招聘業務要獎勵58豆,房產使用者發布帖子後,房產業務要送2個置頂,二手使用者發布帖子後,二手業務要修改使用者統計資料。

對於這類需求,常見的實現方式是,使用呼叫關係:

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

這種方法的壞處是:

1)帖子發布流程的執行時間增加了

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

優化方案是,採用mq解耦:

1)帖子發布成功後,向mq發乙個訊息

2)哪個下游關注「帖子發布成功」的訊息,主動去mq訂閱

採用mq的優點是:

1)上游執行時間短

2)上下游邏輯+物理解耦,除了與mq有物理連線,模組之間都不相互依賴

3)新增乙個下游訊息關注方,上游不需要修改任何**

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

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

一般採用「**閘道器+mq」方案來解耦:

4)閘道器將返回結果通知mq

5)請求方收到結果通知

總結mq是乙個網際網路架構中常見的解耦利器。

什麼時候不使用mq?

上游實時關注執行結果

什麼時候使用mq?

1)資料驅動的任務依賴

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

3)非同步返回執行時間長

到底什麼時候該使用MQ?

一 緣起 一切脫離業務的架構設計與新技術引入都是耍流氓。引入乙個技術之前,首先應該解答的問題是,這個技術解決什麼問題。就像微服務分層架構之前,應該首先回答,為什麼要引入微服務,微服務究竟解決什麼問題 詳見 網際網路架構為什麼要做微服務?不少詢問,究竟什麼時候使用mq,mq究竟適合什麼場景,故有了此文...

什麼時候該休息

睡眠是身體進行自我調整的時刻,你侵略它的時間,它便侵略你的健康 有些人原本一向身體健康,但在連續熬夜數晚後,突然第二天起床會覺得很疲勞,一閉眼就想睡覺,而且會腰痠背痛,但一到晚上精神又好起來!別以為這是小事!根據中醫的看法,是因過勞而造成體內器官陰陽失調,就是體內器官起內訌,互相打架,最後造成器官衰...

什麼時候該使用前置宣告?

首先,我們為什麼要包括標頭檔案?問題的回答很簡單,通常是我們需要獲得某個型別的定義 definition 那麼接下來的問題就是,在什麼情 況下我們才需要型別的定義,在什麼情況下我們只需要宣告就足夠了?問題的回答是當我們需要知道這個型別的大小或者需要知道它的函式簽名的時候,我們就需要獲得它的定義。假設...