踩坑案例 一分錢引發的系統設計「踩坑」案例

2021-08-28 02:09:51 字數 2688 閱讀 3747

阿里巴巴的電商業務十分複雜,一方面是市場多樣化,業務多樣化,另外是消費者,商家的影響面非常廣,任何乙個小故障都可能引發一些社會問題,所以阿里對產品的質量,對服務的連續性有嚴格的要求。阿里技術人員在日常的研發運維過程中,積累了豐富的實戰經驗。今天,為大家分享乙個關於故障,排查,分析和改進的真實案例。他山之石可以攻玉,希望對廣大開發和運維工程師帶來幫助。

背景說明某日,做產品x的開發接到客戶公司**,說是對賬出了1分錢的差錯,無法處理。本著「客戶第一」的宗旨,開發立馬上線檢視情況。查完發現,按照產品x當日的年化收益率,正常情況下使用者在轉入57元後一共收益3分錢,合計是57.03元。但是該客戶當日卻有一筆消費57.04元,導致客戶公司系統對多出的1分錢處理不了。再進一步分析,發現使用者收益結轉時多了1分錢的收益,並且已消費……

也就是說,本來使用者只有3分錢收益,結果多發了1分錢給他,也就給公司造成1分錢的損失!使用者在產品x裡當天收益本應該是0.03元,怎麼會變成0.04元呢?多出的1分錢收益從**來的呢?

資料庫記錄分析

帶著上面的一系列疑問,開發人員首先排查了產品x收益的資料庫記錄。通過查詢資料庫發現,該使用者收益結轉在同一天內存在2筆交易記錄。交易記錄1建立時間為8:00:23,記錄2建立時間為8:00:29,交易記錄1和2的最後修改時間均為8:00:29,如圖4-1所示。

正常情況下產品x收益每天只會結轉一次,而這個使用者當日有兩筆收益結轉記錄。開發人員懷疑,很可能是出現了併發問題。

繼續跟蹤第一筆「txid a」的記錄,開發確認線上日誌存在超時情況,失敗原因是資料庫鏈結數已滿,執行緒等待提交。

分布式鎖超時時間是5s,第一筆記錄從建立到修改提交經歷了6s,由此可見是在分布式鎖失效之後,獲得了資料庫鏈結,進行提交成功。

有了以上三個排查思路後,我們可以開始逆推整個過程。

過程逆推

根據資料庫記錄逆推當時的運**況,如圖4-2所示。

(1)由於資料庫連線數被佔滿,流水1建立的事務處於等待提交狀態。

(2)系統a發現交易失敗,重試次數不滿8次的,立即發起重試,觸發生成流水2的請求。

(3)5s以內資料均被分布式鎖攔截,無法提交。

(4)經過5s後,系統b的分布式鎖失效,此時事務仍在等待未提交。

(5)6s時,流水2成功越過資料庫查詢冪等校驗發起事務,此時流水1拿到資料庫連線,流水1和2兩個事務同時提交。

(6)由於資料庫未做唯一索引,且支付受理模組打穿下層冪等原則,生成2個txid,導致兩事務同時提交成功。

(7)收益結轉重複記賬,使用者多了一筆收入。

深入分析

完成了整個問題的過程逆推後,開發人員進一步分析,發現問題真正的原因還是在系統設計上。如圖4-3所示,系統a的事務允許一定時間的等待,而上層業務的重試時間又比這個等待的時間要短。這就存在乙個問題:系統a的事務還在等待中,業務就又發起了重試。如果是在這個應用場景下(可能業務上對重試要求更高一些),那麼對冪等控制的要求就更高了。而僅僅通過乙個分布式鎖來控制,如果分布式鎖的超時時間設定的比事務允許等待的時間短,那麼在鎖失效之後就一定會同時提交兩筆請求。

繼續對整個過程抽象化,開發人員得出乙個結論:分布式鎖在以下條件同時滿足的情況下併發控制會被打穿。

(1)上層業務系統層面有重試機制。

(2)業務請求存在一定時間之後提交成功的情況,例如本例中第一次請求在事務等待6s後獲得了資料庫鏈結,提交資料庫成功。

(3)下游系統缺乏其他有效的冪等控制手段。

思考了解了問題的來龍去脈後,接下來要怎麼解決這類問題呢?我們想了以下幾個方案。

(1)調整b系統上的tr和分布式鎖超時時間,tr超時調整為10s,分布式鎖超時調整為30s。

(2)防止做收益結轉產生併發控制冪等,調整了收益結轉流水號的生成規則:前8位取x收益結轉傳入的交易號的前8位,第10位系統版本設定為「9」,最後8位seq取交易號的最後8位,降低問題出現機率。

方案一:調整超時時間

調整超時時間後,業務重試時間與分布式鎖有效時間的分布時間軸如圖4-4所示,即在事務允許等待後提交成功的時間之外,再進行重試,另外分布式鎖在整個階段均有效,防止提交。

方案一驗證有效。

如圖4-5所示,單純靠分布式鎖不是控制併發冪等的方式,最穩妥的方式還是在提交記錄的時候通過資料庫嚴格控制冪等。確保不論如何設定超時時間,都不會出現冪等控制的問題。

方案二驗證有效。

小結資金安全無小事,而冪等控制又是資金安全中的重中之重。回顧本文案例,從問題分析定位,到整個邏輯的梳理清洗,其中涉及了三個時間軸的相互作用,再加上事務、分布式鎖、重試等,整個問題發生的邏輯還是比較複雜的。因此,在系統併發冪等控制設計中,單純的分布式鎖並不具備嚴格控制併發冪等的作用,建議在系統設計時,將第三方唯一性的冪等控制作為冪等控制的兜底方案,控制好這道冪等防線,這樣不論業務如何設計,就萬變不離其宗了。

不花一分錢讓手機支援原聲原唱

原聲原唱是目前新手機的一大賣點,我的三星x199沒有這個功能,但通過刷機,我讓它擁有了這些功能,真是爽呆了,不花一分錢耶。刷機讓我嚐到的手機diy的樂趣。刷機其實就是公升級手機的作業系統,就象把電腦的作業系統從win98公升級到win2k winxp等,這樣它就擁有更多功能。最明顯的好處就是支援大容...

一分錢充電是破局還是攪局?

近日,國網 山東 電動汽車服務 發布一則嚴正宣告,痛斥野蠻資本大搞 一分錢充電 引發了廣大 新能源車主的熱議。同時,山東國網還宣布下調省內部分充電站的服務費,最低僅0.1元 kwh,以維護充電市場的 健康穩定 對此,有新能源車主告訴懂懂筆記,不少民營充電站大搞 戰的現象,在全國各地都並不罕見,有個別...

如何用好AWS上的每一分錢

不是所有 aws使用者都有如經營者一般的成本意識,他們可能開啟了乙個高配置服務後,就放置不管了。而大部分的 aws服務又是按時間進行收費。在無形中,會導致公司資源的浪費。當許可權控制在某乙個或幾個有成本意識的人的手中,就能盡量避免資源的浪費。同時在開啟資源前,也會經過他們的評估,啟動與需求最適配的例...