1. 背景
調用第三方接口在很多系統中都很常見,不管是調用本公司其他業務平臺的接口,還是調用第三方公司的接口,一定要注意系統的容錯性,謹記:任何第三方都是不可信的。
常見問題:雪崩
如客戶端訪問B服務,由于網絡原因或者自身的原因,如果B服務不能及時響應,客戶端將處于阻塞狀態,直到B服務響應。此時若有大量的請求涌入,客戶端線程資源會被消耗完畢,導致客戶端也癱瘓。造成的級聯災難,這就是服務“雪崩”效應。
2. 最佳實踐
2.1. 監控與告警
接口異常要記錄,盡可能地保存業務信息,方便還原信息,錯誤達到閾值要報警
同時需要將接口的響應時間進行監控,針對響應時間慢的接口需要和接口提供方溝通是否有優化空間。
2.2. 超時設置
超時設置主要有兩個參數:連接超時(ConnectionTimeout)、讀取超時(ReadTimeout)。
需要合理的設置超時參數(通過壓測數據確認超時時間),不能無限等待,如果設置超時時間過長,在高并發場景下容易導致線程掛起,CPU負載飆高,超時時間太短容易出現超時異常。
2.3. 異步處理
針對接口響應時間長的接口,可以和接口提供方協商改為異步接口,通過回調通知結果。
2.4. 服務隔離
按照一定的原則劃分為若干個外部服務模塊,各個模塊之間相對獨立,無強依賴。當有故障發生時,能將問題和影響隔離在某個模塊內部,而不擴散風險,不波及其它模塊,不影響整體的系統服務。
2.5. 限流
限流也是為了保障系統的安全性,因為有時業務方因為業務擴展導致調用量激增,容易引起服務端宕機。
請求量超過接口上限時系統可以拒絕請求或排隊,以此保證系統的安全性。
先壓測給出合理評估量,如TPS(每秒處理的請求量);這樣既不會造成系統資源的浪費。
常見的限流規則:
當接口QPS達到某個閾值,則限流
- 快速失敗:常規流控方式。當前接口超過設置閾值的流量,直接拒絕多余的請求。
- 預熱啟動:適用于避免突增流量瞬間沖擊系統的場景。請求流量會在預熱時間內緩步增加至閾值量級,多余請求會直接拒絕掉。
- 排隊等待:適用于流量勻速器場景。觸發流控后,多余請求會按照順序等待,達到等待時長后失敗
2.6. 熔斷
斷路器是一種非常有效的容錯機制,可以在應用程序出現故障或異常時快速失敗(如果不快速失敗,上游服務線程會一直等待響應,占用一個線程),避免上層服務級聯崩潰,并且可以在一定的時間窗口內嘗試恢復故障組件的訪問,從而提高應用程序的可用性和穩定性。
統計某個時間窗口
- 根據慢調用比例%
- 慢調用響應時間RT達到xx毫秒,則進行熔斷,熔斷xx秒(在該時間段內,該接口的請求都會快速失敗。可以返回降級的值)
- 根據異常比例%
- 異常比例達到閾值百分比,則進行熔斷,熔斷xx秒(在該時間段內,該接口的請求都會快速失敗。可以返回降級的值)
2.7. 降級
和熔斷相結合,當觸發熔斷后,直接返回預設好的結果。