訊息與遠端呼叫

2021-10-07 12:48:54 字數 2690 閱讀 7013

二、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位址 以及特定...