二、mq的使用場景
mq的不足是:
1)系統更複雜,多了乙個mq元件
2)訊息傳遞路徑更長,延時會增加
3)訊息可靠性和重複性互為矛盾,訊息不丟不重難以同時保證
4)上游無法知道下游的執行結果,這一點是很致命的
【典型場景一:資料驅動的任務依賴】
什麼是任務依賴,舉個栗子,網際網路公司經常在凌晨進行一些資料統計任務,這些任務之間有一定的依賴關係,比如:
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)如果有乙個任務的執行時間要調整,將會有多個任務的執行時間要調整
無論如何,採用「cron排班表」的方法,各任務耦合
優化方案是,採用mq解耦:
1)task1準時開始,結束後發乙個「task1 done」的訊息
2)task2訂閱「task1 done」的訊息,收到訊息後第一時間啟動執行,結束後發乙個「task2 done」的訊息
3)task3同理
採用mq的優點是:
1)不需要預留buffer,上游任務執行完,下游任務總會在第一時間被執行
2)依賴多個任務,被多個任務依賴都很好處理,只需要訂閱相關訊息即可
3)有任務執行時間變化,下游任務都不需要調整執行時間
需要特別說明的是,mq只用來傳遞上游任務執行完成的訊息,並不用於傳遞真正的輸入輸出資料。
採用mq的優點是:
1)上游執行時間短
2)上下游邏輯+物理解耦,除了與mq有物理連線,模組之間都不相互依賴
3)新增乙個下游訊息關注方,上游不需要修改任何**
【典型場景四:緩衝流量,削峰填谷】
高併發場景下的服務通訊,不管採用「直接呼叫」還是「mq推送」,都有乙個缺點,下游訊息接收方無法控制到達自己的流量,如果呼叫方不限速,很有可能把下游壓垮。
舉個栗子,秒殺業務:
上游發起下單操作
下游完成秒殺業務邏輯(庫存檢查,庫存凍結,餘額檢查,餘額凍結,訂單生成,餘額扣減,庫存扣減,生成流水,餘額解凍,庫存解凍)
上游下單業務簡單,每秒發起了10000個請求,下游秒殺業務複雜,每秒只能處理2000個請求,很有可能上游不限速的下單,導致下游系統被壓垮,引發雪崩。
為了避免雪崩,常見的優化方案有兩種:
1)業務上游佇列緩衝,限速傳送
2)業務下游佇列緩衝,限速執行
問:如何緩衝流量?
使用mq做訊息緩衝。由mq-server推模式,公升級為mq-client拉模式。mq-client根據自己的處理能力,每隔一定時間,或者每次拉取若干條訊息,實施流控,達到保護自身的效果。並且這是mq提供的通用功能,無需上下游修改**。
問:如果上游傳送流量過大,會不會導致訊息在mq中堆積?
為了避免訊息在mq中堆積,下游訊息接收方可以批量處理訊息,提公升整體吞吐量。
結論1)mq-client提供拉模式,定時或者批量拉取,可以起到削平流量,下游自我保護的作用(mq需要做的)
2)要想提公升整體吞吐量,需要下游優化,例如批量處理等方式(訊息接收方需要做的)
mq是乙個網際網路架構中常見的解耦利器。
什麼時候不使用mq?
上游實時關注執行結果
什麼時候使用mq?
資料驅動的任務依賴
上游不關心多下游執行結果
非同步返回執行時間長
緩衝流量,削峰填谷
遠端呼叫RPC與Rest區別
一 rest與rpc概念 什麼是rest rest是一種架構風格,指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程式或設計就是 restful。rest規範把所有內容都視為資源,網路上一切皆資源。rest並沒有創造新的技術,元件或服務,只是使用web的現有特徵和能力。可以完全通過http...
詳解RPC遠端呼叫和訊息佇列MQ的區別
rpc remote procedure call 遠端過程呼叫,主要解決遠端通訊間的問題,不需要了解底層網路的通訊機制。知名度較高的有thrift fb的 dubbo 阿里的 1 建立通訊 首先要解決通訊的問題 即a機器想要呼叫b機器,首先得建立起通訊連線,主要是通過在客戶端和伺服器之間建立tcp...
詳解RPC遠端呼叫和訊息佇列MQ的區別
知名度較高的有thrift fb的 dubbo 阿里的 grpc google 等 1 建立通訊 首先要解決通訊的問題 即a機器想要呼叫b機器,首先得建立起通訊連線,主要是通過在客戶端和伺服器之間建立tcp連線。2 服務定址 要解決定址的問題,a伺服器上如何連線到b伺服器 如主機或ip位址 以及特定...