1. 程式人生 > >跨公網呼叫的大坑與架構優化方案

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

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

一、緣起與大坑

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

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

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

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

如上圖1-4所述:

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

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

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

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

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

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

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

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

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

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

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

潛在優化方案?

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

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

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

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

二、非同步代理法

業務場景:通過OpenID實時獲取微信使用者基本資訊

解決方案:增加一個代理,向服務遮蔽究竟是“本地實時”還是“非同步遠端”去獲取返回結果

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

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

(2)內部service呼叫非同步代理service

(3)非同步代理service通過OpenID在本地拿取資料

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

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

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

(6)非同步代理service定期跨公網呼叫微信服務

(7)微信服務返回資料

(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)非同步呼叫第三方介面同步資料

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

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

五、總結

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

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

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

降低影響的優化方案

  • 增大工作執行緒數

  • 降低超時時間

  • 服務垂直拆分

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

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

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

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

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

這個鍋,我們不背。

1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,

需要突破技術瓶頸的可以加。

2、在公司待久了,過得很安逸,

但跳槽時面試碰壁。

需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,

常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。

但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5. 群號:高階架構群 Java進階群:180705916.備註好資訊!送架構視訊。

6.阿里Java高階大牛直播講解知識點,分享知識,

多年工作經驗的梳理和總結,帶著大家全面、

科學地建立自己的技術體系和技術認知!