第三方接口掛掉,我們的服務(wù)會受影響么?
一、緣起與大坑
很多時候,業(yè)務(wù)需要跨公網(wǎng)調(diào)用一個第三方服務(wù)提供的接口,為了避免每個調(diào)用方都依賴于第三方服務(wù),往往會抽象一個服務(wù):
?解除調(diào)用方與第三方接口的耦合
?當(dāng)?shù)谌降慕涌谧儎訒r,只有服務(wù)需要修改,而不是所有調(diào)用方均修改
此時
接口調(diào)用流程是什么樣的呢?如上圖1-4所述:
(1)業(yè)務(wù)調(diào)用方調(diào)用內(nèi)部service
(2)內(nèi)部service跨公網(wǎng)調(diào)用第三方接口
(3)第三方接口返回結(jié)果給內(nèi)部service
(4)內(nèi)部service返回結(jié)果給業(yè)務(wù)調(diào)用方
這個過程存在什么潛在的大坑呢?內(nèi)部服務(wù)可能對上游業(yè)務(wù)提供了很多服務(wù)接口,
當(dāng)有一個接口跨公網(wǎng)第三方調(diào)用超時時,可能導(dǎo)致所有接口都不可用,即使大部分接口不依賴于跨公網(wǎng)第三方調(diào)用。
為什么會出現(xiàn)這種情況呢?內(nèi)部服務(wù)對業(yè)務(wù)方提供的
N個接口,會共用服務(wù)容器內(nèi)的工作線程(假設(shè)有100個工作線程)。
假設(shè)這N個接口的某個接口跨公網(wǎng)依賴于第三方的接口,發(fā)生了網(wǎng)絡(luò)抖動,或者接口超時(不妨設(shè)超時時間為5秒)。
潛臺詞是,這個
工作線程會被占用5秒鐘,然后超時返回業(yè)務(wù)調(diào)用方。
假設(shè)這個請求的吞吐量為20qps,言下之意,
很短的時間內(nèi),所有的100個工作線程都會被卡在這個第三方超時等待上,而其他N-1個原本沒有問題的接口,也得不到工作線程處理。
潛在優(yōu)化方案??
增大工作線程數(shù)(不根本解決問題)
?
降低超時時間(不根本解決問題)
?
垂直拆分,N個接口拆分成若干個服務(wù),使得在出問題時,被牽連的接口盡可能少(依舊不根本解決問題,難道一個服務(wù)只提供一個接口嗎?)
跨公網(wǎng)調(diào)用的穩(wěn)定性優(yōu)化,是本文要討論的問題。
二、異步代理法
業(yè)務(wù)場景:
通過OpenID實(shí)時獲取微信用戶基本信息解決方案:
增加一個代理,向服務(wù)屏蔽究竟是“本地實(shí)時”還是“異步遠(yuǎn)程”去獲取返回結(jié)果本地實(shí)時流程如上圖1-5:
(1)業(yè)務(wù)調(diào)用方調(diào)用內(nèi)部service
(2)內(nèi)部service調(diào)用異步代理service
(3)異步代理service通過OpenID在本地拿取數(shù)據(jù)
(4)異步代理service將數(shù)據(jù)返回內(nèi)部service
(5)內(nèi)部service返回結(jié)果給業(yè)務(wù)調(diào)用方
異步遠(yuǎn)程流程如上圖6-8粗箭頭的部分:
(6)異步代理service定期跨公網(wǎng)調(diào)用微信服務(wù)
(7)微信服務(wù)返回數(shù)據(jù)
(8)刷新本地數(shù)據(jù)
優(yōu)點(diǎn):公網(wǎng)抖動,第三方接口超時,不影響內(nèi)部接口調(diào)用
不足:本地返回的不是最新數(shù)據(jù)(很多業(yè)務(wù)可以接受數(shù)據(jù)延時)
有時候,內(nèi)部service和異步代理service可以
合成一個service三、第三方接口備份與切換法
業(yè)務(wù)場景:調(diào)用
第三方短信網(wǎng)關(guān),或者電子合同等解決方案:
同時使用(或者備份)多個第三方服務(wù)流程如上圖1-4:
(1)業(yè)務(wù)調(diào)用方調(diào)用內(nèi)部service
(2)內(nèi)部service調(diào)用第一個三方接口
(3)超時后,調(diào)用第二個備份服務(wù),未來都直接調(diào)用備份服務(wù),直到超時的服務(wù)恢復(fù)
(4)內(nèi)部service返回結(jié)果給業(yè)務(wù)調(diào)用方
優(yōu)點(diǎn):公網(wǎng)抖動,第三方接口超時,不影響內(nèi)部接口調(diào)用(初期少數(shù)幾個請求會超時)
不足:不是所有公網(wǎng)調(diào)用都能夠像短息網(wǎng)關(guān),電子合同服務(wù)一樣有備份接口的,像微信、支付寶等就只此一家
四、異步調(diào)用法
業(yè)務(wù)場景:
本地結(jié)果,同步第三方服務(wù),例如用戶在58到家平臺下單,58到家平臺需要通知平臺商家為用戶提供服務(wù)
解決方案:
本地調(diào)用成功就返回成功,異步調(diào)用第三方接口同步數(shù)據(jù)(和異步代理有微小差別)
本地流程如上圖1-3:
(1)業(yè)務(wù)調(diào)用方調(diào)用內(nèi)部service
(2)內(nèi)部service寫本地數(shù)據(jù)
(3)內(nèi)部service返回結(jié)果給業(yè)務(wù)調(diào)用方成功
異步流程如上圖4-5粗箭頭的部分:
(4)異步service定期將本地數(shù)據(jù)取出(或者通知也行,實(shí)時性好)
(5)異步調(diào)用第三方接口同步數(shù)據(jù)
優(yōu)點(diǎn):公網(wǎng)抖動,第三方接口超時,不影響內(nèi)部接口調(diào)用
不足:不是所有業(yè)務(wù)場景都可以異步同步數(shù)據(jù)
五、總結(jié)
跨公網(wǎng)調(diào)用第三方,
可能存在的問題:
?
公網(wǎng)抖動,第三方服務(wù)不穩(wěn)定,影響自身服務(wù)?
一個接口超時,占住工作線程,影響其他接口降低影響的
優(yōu)化方案:
?
增大工作線程數(shù)?
降低超時時間?
服務(wù)垂直拆分業(yè)務(wù)需求決定技術(shù)方案,結(jié)合業(yè)務(wù)的解決方案:
?
業(yè)務(wù)能接受舊數(shù)據(jù):
讀取本地數(shù)據(jù),異步代理定期更新數(shù)據(jù)?
有多個第三方服務(wù)提供商:
多個第三方互備?
向第三方同步數(shù)據(jù):
本地寫成功就算成功,異步向第三方同步數(shù)據(jù)希望第三方的服務(wù)掛掉,不再影響大家的服務(wù)。
更多建議: