祭天的支付故障:雪崩

0 評論 1047 瀏覽 0 收藏 6 分鐘

“支付故障之痛,雪崩教訓深刻?!?在互聯網支付領域,系統穩定至關重要。一次看似微小的問題,如何引發了災難性的雪崩?我們又能從中吸取哪些教訓,以保障支付系統的安全與可靠?

我是從傳統行業轉互聯網支付,剛進入支付行業那幾年,經歷了很多線上故障。

除了上一篇說到的渠道短號導致資損幾十萬的故障,還有一個可以拖出去祭天的故障,導致的后果嚴重性遠超上一個:不但整個支付系統宕機,錯亂的數據就有幾十萬條,修數就修了四天三夜。

好在領導真的人好,保住我小命一條,但是領導自己的年終和晉升給祭天了。

故事從好些年前說起,那時分布式應用已經起來,但是微服務還沒有成氣候。

支付系統由臺服務器組成集群服務,每臺服務器都有完整的全應用部署,包括收銀支付,收單,渠道網關,會員,商服等全部子應用,從入口開始直到調用渠道,全部在一臺服務器內部搞定,各子應用之間的服務是獨立的,通過socket調用。

整體架構如下圖所示。

那時還是直連銀行,日常沒有什么問題,經過幾次大促的洗禮都平安度過。

直到有一次大促,流量特別高,大促開始沒幾分鐘,就有一家銀行出現慢處理問題,具體表現為平時1S就返回,變成了平均2到5分鐘才返回結果。

很不幸,當前網關的配置有缺陷,導致配置的超時時間沒有生效,所有與這家銀行的請求平均耗時2到5分鐘才釋放,導致網關的線程耗盡。

悲劇由此拉開序幕。

首先是網關的線程耗盡,導致其它銀行的請求也得不到及時的處理。

然后是內部各子應用之間全部是同步調用,網關的問題快速蔓延到了上游應用,上游各子應用的線程數也被耗盡,雪崩出現,整個支付系統無法正常處理業務請求。

那也是我職業生涯中第一次聽說“雪崩”這個名詞可以用在技術領域。

如前面所說,當時數據訂正就花了四天三夜,每天在公司的行軍床上躺2小時。

前車之鑒,后車之師。還是有一些教訓可以總結一下。

強制設置合理的超時時間,并驗證有效。這里面包含2層意思:

合理的超時時間。比如不同的外部渠道以及同一渠道不同的接口,響應時間都是不一樣的,需要統計90分位,95分位,98分位等多個時間。一般覆蓋95分位就差不多。

需要驗證有效。很多技術參數在表面上看是設置了,但是實際可能不是預期那樣。就拿http來說,就有連接超時,寫入超時,讀取超時等多個超時參數。一定需要模擬測試驗證,達到預期效果。

服務隔離。比如為不同的渠道做線程池隔離。一個渠道掛了不影響另外一個渠道。

健全的服務降級、熔斷、限流能力。現在的微服務框架基本都有自動化的服務降級、熔斷、限流能力,但是需要提前做好配置。提供有損服務好過完全無服務可用。

用好同步受理異步處理機制。比如最外部的渠道網關,因為外部渠道的耗時都比較長,就采用同步受理異步處理的模式:先把交易信息收下來,落庫,馬上返回給上游受理成功,然后再起異步線程把請求發出去。

這樣有兩個好處:

1)可以為網關單獨擴大線程池的最大線程配置。因為網關已經變為IO密集型應用。

2)網關的慢處理(比如耗時2S),不影響上游,上游可以毫秒級就處理完自己的業務。

壓測和預案。前者是提前發現問題,后者是問題出現后可以指導快速響應。

當交易量足夠大,一個小小的問題也有可能被放大到無法承受之重。

無知的人,給平臺帶來的傷痛最深。

本文由人人都是產品經理作者【隱墨星辰】,微信公眾號:【隱墨星辰】,原創/授權 發布于人人都是產品經理,未經許可,禁止轉載。

題圖來自Unsplash,基于 CC0 協議。

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 目前還沒評論,等你發揮!