一、緣起
一切脫離業務的架構設計與新技術引入都是耍流氓。
引入乙個技術之前,首先應該解答的問題是,這個技術解決什麼問題。
就像微服務分層架構之前,應該首先回答,為什麼要引入微服務,微服務究竟解決什麼問題(詳見《網際網路架構為什麼要做微服務?》)。
不少網友詢問,究竟什麼時候使用mq,mq究竟適合什麼場景,故有了此文。
二、mq是幹嘛的
訊息匯流排(message queue),後文稱mq,是一種跨程序的通訊機制,用於上下游傳遞訊息。
在網際網路架構中,mq是一種非常常見的上下游「邏輯解耦+物理解耦」的訊息通訊服務。
使用了mq之後,訊息傳送上游只需要依賴mq,邏輯上和物理上都不用依賴其他服務。
三、什麼時候不使用訊息匯流排
mq的不足是:
舉個栗子:使用者登入場景,登入頁面呼叫passport服務,passport服務的執行結果直接影響登入結果,此處的「登入頁面」與「passport服務」就必須使用呼叫關係,而不能使用mq通訊。
無論如何,記住這個結論:呼叫方實時依賴執行結果的業務場景,請使用呼叫,而不是mq。
四、什麼時候使用mq
【典型場景一:資料驅動的任務依賴】
什麼是任務依賴,舉個栗子,網際網路公司經常在凌晨進行一些資料統計任務,這些任務之間有一定的依賴關係,比如:
這樣的話,tast1, task2, task3之間就有任務依賴關係,必須task1先執行,再task2執行,載task3執行。
對於這類需求,常見的實現方式是,使用cron人工排執行時間表:
這種方法的壞處是:
優化方案是,採用mq解耦:
採用mq的優點是:
需要特別說明的是,mq只用來傳遞上游任務執行完成的訊息,並不用於傳遞真正的輸入輸出資料。
【典型場景二:上游不關心執行結果】
上游需要關注執行結果時要用「呼叫」,上游不關注執行結果時,就可以使用mq了。
舉個栗子,58同城的很多下游需要關注「使用者發布帖子」這個事件,比如招聘使用者發布帖子後,招聘業務要獎勵58豆,房產使用者發布帖子後,房產業務要送2個置頂,二手使用者發布帖子後,二手業務要修改使用者統計資料。
對於這類需求,常見的實現方式是,使用呼叫關係:
帖子發布服務執行完成之後,呼叫下游招聘業務、房產業務、二手業務,來完成訊息的通知,但事實上,這個通知是否正常正確的執行,帖子發布服務根本不關注。
這種方法的壞處是:
優化方案是,採用mq解耦:
採用mq的優點是:
典型場景三:上游關注執行結果,但執行時間很長
有時候上游需要關注執行結果,但執行結果時間很長(典型的是呼叫離線處理,或者跨公網呼叫),也經常使用**閘道器+mq來解耦。
一般採用「**閘道器+mq」方案來解耦:
閘道器將返回結果通知mq
請求方收到結果通知
五、總結
mq是乙個網際網路架構中常見的解耦利器。
什麼時候不使用mq?
什麼時候使用mq?
到底什麼時候該使用MQ?
mq是幹嘛的 訊息匯流排 message queue 後文稱mq,是一種跨程序的通訊機制,用於上下游傳遞訊息。在網際網路架構中,mq是一種非常常見的上下游 邏輯解耦 物理解耦 的訊息通訊服務。使用了mq之後,訊息傳送上游只需要依賴mq,邏輯上和物理上都不用依賴其他服務。什麼時候不使用訊息匯流排 mq...
什麼時候該休息
睡眠是身體進行自我調整的時刻,你侵略它的時間,它便侵略你的健康 有些人原本一向身體健康,但在連續熬夜數晚後,突然第二天起床會覺得很疲勞,一閉眼就想睡覺,而且會腰痠背痛,但一到晚上精神又好起來!別以為這是小事!根據中醫的看法,是因過勞而造成體內器官陰陽失調,就是體內器官起內訌,互相打架,最後造成器官衰...
什麼時候該使用前置宣告?
首先,我們為什麼要包括標頭檔案?問題的回答很簡單,通常是我們需要獲得某個型別的定義 definition 那麼接下來的問題就是,在什麼情 況下我們才需要型別的定義,在什麼情況下我們只需要宣告就足夠了?問題的回答是當我們需要知道這個型別的大小或者需要知道它的函式簽名的時候,我們就需要獲得它的定義。假設...