跨公網呼叫的大坑與架構優化方案

2022-05-05 11:12:11 字數 2225 閱讀 5595

第三方介面掛掉,我們的服務會受影響麼?

一、緣起與大坑

很多時候,業務需要跨公網呼叫乙個第三方服務提供的介面,為了避免每個呼叫方都依賴於第三方服務,往往會抽象乙個服務:

解除呼叫方與第三方介面的耦合

當第三方的介面變動時,只有服務需要修改,而不是所有呼叫方均修改

此時介面呼叫流程是什麼樣的呢?

如上圖1-4所述:

(1)業務呼叫方呼叫內部service

(2)內部service跨公網呼叫第三方介面

(3)第三方介面返回結果給內部service

(4)內部service返回結果給業務呼叫方

這個過程存在什麼潛在的大坑呢?

內部服務可能對上游業務提供了很多服務介面,當有乙個介面跨公網第三方呼叫超時時,可能導致所有介面都不可用,即使大部分介面不依賴於跨公網第三方呼叫。

為什麼會出現這種情況呢?

內部服務對業務方提供的n個介面,會共用服務容器內的工作執行緒(假設有100個工作執行緒)。

假設這n個介面的某個介面跨公網依賴於第三方的介面,發生了網路抖動,或者介面超時(不妨設超時時間為5秒)。

潛台詞是,這個工作執行緒會被占用5秒鐘,然後超時返回業務呼叫方。

假設這個請求的吞吐量為20qps,言下之意,很短的時間內,所有的100個工作執行緒都會被卡在這個第三方超時等待上,而其他n-1個原本沒有問題的介面,也得不到工作執行緒處理。

潛在優化方案?

增大工作執行緒數(不根本解決問題)

降低超時時間(不根本解決問題)

垂直拆分,n個介面拆分成若干個服務,使得在出問題時,被牽連的介面盡可能少(依舊不根本解決問題,難道乙個服務只提供乙個介面嗎?)

跨公網呼叫的穩定性優化,是本文要討論的問題。

二、非同步**法

解決方案:增加乙個**,向服務遮蔽究竟是「本地實時」還是「非同步遠端」去獲取返回結果

本地實時流程如上圖1-5:

(1)業務呼叫方呼叫內部service

(2)內部service呼叫非同步**service

(3)非同步**service通過openid在本地拿取資料

(4)非同步**service將資料返回內部service

(5)內部service返回結果給業務呼叫方

非同步遠端流程如上圖6-8粗箭頭的部分:

(8)重新整理本地資料

優點:公網抖動,第三方介面超時,不影響內部介面呼叫

不足:本地返回的不是最新資料(很多業務可以接受資料延時)

有時候,內部service和非同步**service可以合成乙個service

三、第三方介面備份與切換法

業務場景:呼叫第三方簡訊閘道器,或者電子合同等

解決方案:同時使用(或者備份)多個第三方服務

流程如上圖1-4:

(1)業務呼叫方呼叫內部service

(2)內部service呼叫第乙個三方介面

(3)超時後,呼叫第二個備份服務,未來都直接呼叫備份服務,直到超時的服務恢復

(4)內部service返回結果給業務呼叫方

優點:公網抖動,第三方介面超時,不影響內部介面呼叫(初期少數幾個請求會超時)

四、非同步呼叫法

業務場景:本地結果,同步第三方服務,例如使用者在58到家平台下單,58到家平台需要通知平台商家為使用者提供服務

解決方案:本地呼叫成功就返回成功,非同步呼叫第三方介面同步資料(和非同步**有微小差別)

本地流程如上圖1-3:

(1)業務呼叫方呼叫內部service

(2)內部service寫本地資料

(3)內部service返回結果給業務呼叫方成功

非同步流程如上圖4-5粗箭頭的部分:

(4)非同步service定期將本地資料取出(或者通知也行,實時性好)

(5)非同步呼叫第三方介面同步資料

優點:公網抖動,第三方介面超時,不影響內部介面呼叫

不足:不是所有業務場景都可以非同步同步資料

五、總結

跨公網呼叫第三方,可能存在的問題:

公網抖動,第三方服務不穩定,影響自身服務

乙個介面超時,佔住工作執行緒,影響其他介面

降低影響的優化方案:

增大工作執行緒數

降低超時時間

服務垂直拆分

業務需求決定技術方案,結合業務的解決方案:

業務能接受舊資料:讀取本地資料,非同步**定期更新資料

有多個第三方服務提供商:多個第三方互備

向第三方同步資料:本地寫成功就算成功,非同步向第三方同步資料

希望第三方的服務掛掉,不再影響大家的服務。

spring 針對 跨域呼叫的解決方案

spring 針對 跨域呼叫的解決方案 github位址 crossorigin restcontroller public class restdemocontroller ajax 注釋在方法和介面 類 列舉 註解上 target 執行時有效 即執行時保留 retention retention...

乙個跨平台資料遷移的方案優化

如果有一套環境,業務優先順序很高,伺服器的服役時間比我工作時間都長,現在需要遷移到x86平台,而且經過評估,如果能夠公升級資料庫的軟體版本,可以使用到更多的特性和功能。這套環境的資料量大概是800g,停機維護時間在2個小時的樣子,對於很多公司來說,盡可能縮短維護視窗時間,提前起服就意味著有更多的收入...

提高使用者體驗的優化方案 站內優化與站外優化

使用者體驗說得再多其實萬變不離其中,就是使用者通過 得到什麼,可以給使用者帶來什麼,使用者在得到需要的資訊過程中方便嗎?這就是使用者體驗,而往往 內部的優化則是最能影響使用者體驗的,就像自己在別人面前說這別墅怎麼怎麼好,不過都是聽說而已,要想真正信服自然要進屋裡面瞧瞧才知道真假吧。所以,今天筆者談談...