祭天的支付故障:大促高峰運營后臺操作拖死在線交易

2 評論 1156 瀏覽 0 收藏 7 分鐘

在支付系統(tǒng)的復雜世界里,一次不經(jīng)意的后臺操作可能引發(fā)災難性的后果。本文回顧了一起發(fā)生在大促高峰期間的支付故障案例,揭示了一個小小的查詢操作如何導致整個在線交易系統(tǒng)癱瘓。作者隱墨星辰,憑借十余年的支付架構(gòu)設(shè)計經(jīng)驗,深入分析了故障的原因,并提出了有效的解決方案。這篇文章不僅是對歷史的回顧,也是對未來系統(tǒng)設(shè)計的警示。

大家好,我是隱墨星辰,專注境內(nèi)/跨境支付架構(gòu)設(shè)計十余年。

今天我們繼續(xù)聊聊那些“可以拖出去祭天”的線上故障案例。這次不是領(lǐng)導人好,保住我小命一條,而是我不夠資格,大老板把我領(lǐng)導的領(lǐng)導給祭天了。

這也是很多年的故事,當時的微服務(wù)框架還沒有現(xiàn)在這么成熟,限流與服務(wù)隔離也沒有現(xiàn)在這么先進。

起因只是一次小小的后臺查詢操作,卻在大促高峰期引發(fā)了連鎖反應,讓整個系統(tǒng)陷入癱瘓。

一次大促開始不久,一位運營小姐姐在后臺發(fā)起了一個后臺查詢操作,很不幸,觸發(fā)了慢查詢。本來所有在線交易系統(tǒng)都使用緩存以頂住一些讀壓力,但仍然有小部分請求在緩存中找不到數(shù)據(jù),穿透到了數(shù)據(jù)庫,卻遇上這條正在阻塞資源的慢查詢。結(jié)果越來越多請求堆積,數(shù)據(jù)庫CPU瞬間飆升至100%。

DBA嘗試kill連接卻無濟于事,不得已只能重啟數(shù)據(jù)庫??芍貑⒑?,因為在線交易的請求仍在,緩存依舊被打穿,數(shù)據(jù)庫一恢復服務(wù)就再度陷入滿載狀態(tài),陷入惡性循環(huán)。

只能人工先限流,再次重啟,慢慢恢復流量。等服務(wù)完全恢復,大促高峰已經(jīng)過去大半。

事后復盤發(fā)現(xiàn):當時在線交易對那部分數(shù)據(jù)其實并非強依賴,即使拿不到那些數(shù)據(jù),也能繼續(xù)走主流程。但由于缺少弱依賴分析和對應的降級策略,這塊數(shù)據(jù)竟成了全局堵點。

雖然是一次有點久遠的故障,背后的思路對現(xiàn)在的系統(tǒng)設(shè)計仍然有一些借鑒意義。

先看看問題。

首先是后臺操作與線上數(shù)據(jù)庫耦合。大促期間的后臺查詢沒有隔離環(huán)境,直接在生產(chǎn)DB上執(zhí)行引發(fā)慢SQL,將數(shù)據(jù)庫資源長時間占用,影響在線交易。

其次缺乏弱依賴降級策略。這部分數(shù)據(jù)其實是“弱依賴”,在線交易不拿到也能繼續(xù)推進。但系統(tǒng)實現(xiàn)成了強依賴,導致前端請求死等結(jié)果,讓線程和資源耗盡。

同時還缺少自動化限流手段,當慢SQL導致數(shù)據(jù)庫處理能力下降,大量請求同時穿透到后端加劇問題。如果有自動化限流策略,可在異常時快速對請求進行削峰填谷,避免資源被透支。

當然最重要是緩存防擊穿策略欠缺。在高并發(fā)場景下,若緩存未命中數(shù)據(jù)且沒有防擊穿策略,一旦后端阻塞,所有請求將同時穿透數(shù)據(jù)庫,極易造成資源枯竭。應有預熱緩存、單線程代理查詢、請求隊列等措施來防止緩存失效時大量請求直擊后端。

看到問題,對應的措施就比較簡單了。

首先是后臺與線上隔離。在大促期間禁止非所有必要的后臺操作,即使需要也要單獨環(huán)境或讀副本、讀緩存,不要直接跑在核心庫上??梢栽诖蟠贂r切換后臺操作權(quán)限,菜單折疊、權(quán)限下線,減少意外。

其次是弱依賴識別與降級。對主鏈路中的數(shù)據(jù)需求進行強弱依賴分析。對于弱依賴數(shù)據(jù),一旦獲取超時或異常,即刻跳過,不阻塞整個主流程。有損服務(wù)好過無服務(wù)可用。

然后是限流和熔斷。引入自動化限流工具,對下游資源的請求數(shù)量進行控制。當下游變慢或掛掉時,限流可阻止請求洪流加劇問題。

最后是老生常談的緩存防擊穿策略。在高并發(fā)下,緩存穿透會將數(shù)千上萬請求砸向數(shù)據(jù)庫。應提前預熱數(shù)據(jù),讓緩存中長期保留重要信息;對請求加鎖或隊列,讓同一時間只有一個線程去真正請求后端數(shù)據(jù),其余等待結(jié)果,從而避免瞬間集中沖擊。

在這個事故之前,我是沒有想到一個簡單的后臺操作也會搞死在線交易。從另外一個側(cè)面看,當請求量足夠大時,很多隱藏的問題就會暴露,也就是所謂的量變引起質(zhì)變。

一將功成萬骨枯,一個個線上故障成就了一個個經(jīng)驗豐富的工程師。

這是《支付通識》專欄系列文章中的第(11)篇。

深耕境內(nèi)/跨境支付架構(gòu)設(shè)計十余年,歡迎關(guān)注并星標公眾號“隱墨星辰”,和我一起深入解碼支付系統(tǒng)的方方面面。

本文由人人都是產(chǎn)品經(jīng)理作者【隱墨星辰】,微信公眾號:【隱墨星辰】,原創(chuàng)/授權(quán) 發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載。

題圖來自Unsplash,基于 CC0 協(xié)議。

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 在線交易對某些數(shù)據(jù)的依賴性被錯誤地視為強依賴,而實際上這些數(shù)據(jù)是弱依賴,可以采取降級策略。

    來自廣東 回復
  2. 現(xiàn)在需要修復的bug還是要盡快修復,慢慢完善系統(tǒng),防止此事再次發(fā)生。

    來自廣東 回復