摘要:每年支付寶在雙和雙的活動中,都展示了絕佳的技術能力。對于異步并發重復消息的處理亦是如此,加深對狀態機的判斷后還可以處理消息亂序問題。
每年支付寶在雙11和雙12的活動中,都展示了絕佳的技術能力。這個能力不但體現在處理高TPS量的訪問,更體現在幾乎不會出錯,不會出現重復支付的情況,那這個是怎么做到的呢?
誠然,為了實現在高并發下仍不會出錯的技術目標,支付寶下了很多功夫,比如冪等性的處理,分布式事務的使用等等,但是個人覺得其中最關鍵的一點就是“一鎖二判三更新”這句看似毫不起眼的口訣。
何為“一鎖二判三更新”? 簡單來說就是當任何一個并發請求過來的時候
我們先鎖定關聯單據
然后判斷關聯單據狀態,是否之前已經更新過對應狀態了
如果基于第2步判斷,之前并沒有請求更新過對應狀態,則本次請求可以更新并完成相關業務邏輯。如果之前已經有更新過狀態了,則本次不能更新,也不能完成業務邏輯。
示意圖
話不多說,我們直接上代碼:
//第1步鎖當前支付單 PaymentInfo resultPaymentInfo = commonPayCoreService .queryPaymentForUpdate(createPaymentInfo.getId()); if (resultPaymentInfo.isFinalStatus()) { //第2步,判斷當前支付單狀態,如果是終態,則直接返回 //不做任何更新 return resultPaymentInfo; } //第3步更新當前支付單狀態到終態,并完成相關業務邏輯(支付成功) payCoreService.updateRequestResult(payChannelResult);
基于以上方案可以100%確保在并發情況下不會出現重復更新問題,按理論來說,就是每次狀態機變更前,都要在并發安全情況下判斷狀態是否已經發生過變更了。
如果第1步或第2步缺失了,會發生什么問題,我們來看一下:
第1步缺失
第2步缺失
只要把這3步作為我們的代碼規范,則可以避免大部分的并發重復操作問題。對于異步并發重復消息的處理亦是如此,加深對狀態機的判斷后還可以處理消息亂序問題。
對于鎖的使用可根據實際情況選擇悲觀鎖和樂觀鎖。
關于悲觀鎖(數據庫行鎖),樂觀鎖(數據庫版本鎖或分布式鎖)的實現方式和坑我們以后再詳細說。
可能有人會問不管是悲觀鎖還是樂觀鎖對系統的并發量都是有影響的,這個怎么解決?我的觀點是在現代分布式系統中,如果追求高可用和穩定則必須在方案上優先滿足,對于性能可以通過優化代碼邏輯,優化技術架構,擴展數據庫資源等方式來解決。
在之前螞蟻金服的壓測中,我負責的結算系統內部有10次左右SQL調用以及一次遠程調用(約花費100ms),總流程花費180ms左右。在一臺4核8G的機器上壓測,java服務并發可以達到150TPS,結果還是令人滿意的,通過水平服務器擴展完全沒有問題。
在整個支付寶技術架構中,只有一個場景是沒有用鎖和判斷直接更新的,就是2016年的春節五福紅包,高達上百萬的TPS訪問,為了保證用戶的順暢體驗,犧牲了狀態判斷的安全性,在事后再做一次對賬(雖然就算出錯也于事無補了 :))
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70427.html
摘要:每年支付寶在雙和雙的活動中,都展示了絕佳的技術能力。對于異步并發重復消息的處理亦是如此,加深對狀態機的判斷后還可以處理消息亂序問題。 每年支付寶在雙11和雙12的活動中,都展示了絕佳的技術能力。這個能力不但體現在處理高TPS量的訪問,更體現在幾乎不會出錯,不會出現重復支付的情況,那這個是怎么做到的呢? 誠然,為了實現在高并發下仍不會出錯的技術目標,支付寶下了很多功夫,比如冪等性的處理,...
摘要:解決冪等問題的三部曲,也是作者的思考框架。這是解決冪等問題的第二部曲列出并減少副作用的分析維度。所以在并發執行的維度,將并發重復執行變成串行重復執行是最好的冪等解決方案。 綱要 文章目的:本文旨在提煉一套分布式冪等問題的思考框架,而非解決某個具體的分布式冪等問題。在這個框架體系內,會有一些方案舉例說明。文章目標:希望讀者能通過這套思考框架設計出符合自己業務的完備的冪等解決方案。文章內容...
要了解 VPS 存在的原因,我們可能應該退后一步,先看看服務器。服務器是通過網絡向其他計算機提供文件或數據的計算機。服務器可以通過鼠標或鍵盤直接訪問,也可以是所謂的無頭服務器,只能遠程訪問。整個互聯網的核心不過是大量互連服務器的集合。要在線執行任何操作,例如啟動 How-To Geek 之類的網站或運行天氣應用程序等服務,您需要在服務器上運行程序或托管文件。沒有服務器,沒有站點。但問題是,服務器是...
閱讀 725·2021-11-17 09:33
閱讀 3757·2021-09-01 10:46
閱讀 1751·2019-08-30 11:02
閱讀 3280·2019-08-29 15:05
閱讀 1396·2019-08-26 11:39
閱讀 2272·2019-08-23 17:04
閱讀 1973·2019-08-23 15:43
閱讀 1371·2019-08-23 14:12