跨公網呼叫的大坑與架構優化方案
第三方介面掛掉,我們的服務會受影響麼?
一、緣起與大坑
很多時候,業務需要跨公網呼叫一個第三方服務提供的介面,為了避免每個呼叫方都依賴於第三方服務,往往會抽象一個服務:
-
解除呼叫方與第三方介面的耦合
-
當第三方的介面變動時,只有服務需要修改,而不是所有呼叫方均修改
此時介面呼叫流程是什麼樣的呢?
如上圖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高階大牛直播講解知識點,分享知識,
多年工作經驗的梳理和總結,帶著大家全面、
科學地建立自己的技術體系和技術認知!