高并發(fā)系統(tǒng)數(shù)據(jù)冪等的解決方案
前言
在系統(tǒng)開發(fā)過程中,經(jīng)常遇到數(shù)據(jù)重復(fù)插入、重復(fù)更新、消息重發(fā)發(fā)送等等問題,因?yàn)閼?yīng)用系統(tǒng)的復(fù)雜邏輯以及網(wǎng)絡(luò)交互存在的不確定性,會(huì)導(dǎo)致這一重復(fù)現(xiàn)象,但是有些邏輯是需要有冪等特性的,否則造成的后果會(huì)比較嚴(yán)重,例如訂單重復(fù)創(chuàng)建,這時(shí)候帶來的問題可是非同一般啊。
什么是系統(tǒng)的冪等性
冪等是數(shù)據(jù)中得一個(gè)概念,表示N次變換和1次變換的結(jié)果相同。
高并發(fā)的系統(tǒng)如何保證冪等性?
1.查詢
查詢的API,可以說是天然的冪等性,因?yàn)槟悴樵円淮魏筒樵儍纱?,對于系統(tǒng)來講,沒有任何數(shù)據(jù)的變更,所以,查詢一次和查詢多次一樣的。
2.MVCC方案
多版本并發(fā)控制,update with condition,更新帶條件,這也是在系統(tǒng)設(shè)計(jì)的時(shí)候,合理的選擇樂觀鎖,通過version或者其他條件,來做樂觀鎖,這樣保證更新及時(shí)在并發(fā)的情況下,也不會(huì)有太大的問題。
例如:update table_xxx set name=#name#,version=version+1 where version=#version# ,或者是 update table_xxx set quality=quality-#subQuality# where quality-#subQuality# >= 0 。
3.單獨(dú)的去重表
如果涉及到的去重的地方特別多,例如ERP系統(tǒng)中有各種各樣的業(yè)務(wù)單據(jù),每一種業(yè)務(wù)單據(jù)都需要去重,這時(shí)候,可以單獨(dú)搞一張去重表,在插入數(shù)據(jù)的時(shí)候,插入去重表,利用數(shù)據(jù)庫的唯一索引特性,保證唯一的邏輯。
4.分布式鎖
還是拿插入數(shù)據(jù)的例子,如果是分布是系統(tǒng),構(gòu)建唯一索引比較困難,例如唯一性的字段沒法確定,這時(shí)候可以引入分布式鎖,通過第三方的系統(tǒng),在業(yè)務(wù)系統(tǒng)插入數(shù)據(jù)或者更新數(shù)據(jù),獲取分布式鎖,然后做操作,之后釋放鎖,這樣其實(shí)是把多線程并發(fā)的鎖的思路,引入多多個(gè)系統(tǒng),也就是分布式系統(tǒng)中得解決思路。
5.刪除數(shù)據(jù)
刪除數(shù)據(jù),僅僅第一次刪除是真正的操作數(shù)據(jù),第二次甚至第三次刪除,直接返回成功,這樣保證了冪等。
6.插入數(shù)據(jù)的唯一索引
插入數(shù)據(jù)的唯一性,可以通過業(yè)務(wù)主鍵來進(jìn)行約束,例如一個(gè)特定的業(yè)務(wù)場景,三個(gè)字段肯定確定唯一性,那么,可以在數(shù)據(jù)庫表添加唯一索引來進(jìn)行標(biāo)示。
這里有一個(gè)場景,API層面的冪等,例如提交數(shù)據(jù),如何控制重復(fù)提交,這里可以在提交數(shù)據(jù)的form表單或者客戶端軟件,增加一個(gè)唯一標(biāo)示,然后服務(wù)端,根據(jù)這個(gè)UUID來進(jìn)行去重,這樣就能比較好的做到API層面的唯一標(biāo)識。
7.狀態(tài)機(jī)冪等
在設(shè)計(jì)單據(jù)相關(guān)的業(yè)務(wù),或者是任務(wù)相關(guān)的業(yè)務(wù),肯定會(huì)涉及到狀態(tài)機(jī),就是業(yè)務(wù)單據(jù)上面有個(gè)狀態(tài),狀態(tài)在不同的情況下會(huì)發(fā)生變更,一般情況下存在有限狀態(tài)機(jī),這時(shí)候,如果狀態(tài)機(jī)已經(jīng)處于下一個(gè)狀態(tài),這時(shí)候來了一個(gè)上一個(gè)狀態(tài)的變更,理論上是不能夠變更的,這樣的話,保證了有限狀態(tài)機(jī)的冪等。
以上就是高并發(fā)系統(tǒng)數(shù)據(jù)冪等的解決方案的資料整理,后續(xù)繼續(xù)補(bǔ)充相關(guān)知識,謝謝大家對本站的支持!
相關(guān)文章
SQL語句練習(xí)實(shí)例之三——平均銷售等待時(shí)間
有一張Sales表,其中有銷售日期與顧客兩列,現(xiàn)在要求使用一條SQL語句實(shí)現(xiàn)計(jì)算2011-10-10SQL Server學(xué)習(xí)筆記之事務(wù)、鎖定、阻塞、死鎖用法詳解
這篇文章主要介紹了SQL Server學(xué)習(xí)筆記之事務(wù)、鎖定、阻塞、死鎖用法,結(jié)合實(shí)例形式分析了SQL Server中事務(wù)、鎖定、阻塞、死鎖的概念、功能及相關(guān)使用技巧,需要的朋友可以參考下2017-07-07LINQ to SQL:處理char(1)字段的方式會(huì)引起全表掃描問題
1.相關(guān)內(nèi)容: 在SQL Server 2000中,如果數(shù)據(jù)庫的排序規(guī)則為Chinese_PRC_CI_AS,那么查詢時(shí)是不分大小寫的,例如下列這二條SQL語句,查詢的結(jié)果是一樣的。2008-03-03SQL中WHERE變量IS NULL條件導(dǎo)致全表掃描問題的解決方法
今天在評審接手的項(xiàng)目中的存儲(chǔ)過程時(shí),發(fā)現(xiàn)存在大量的在條件里判斷變量是否NULL的寫法2013-09-09SQL Server內(nèi)存遭遇操作系統(tǒng)進(jìn)程壓榨案例分析
最近一臺DB服務(wù)器偶爾出現(xiàn)CPU報(bào)警,我的郵件報(bào)警閾值設(shè)置的是15%,開始時(shí)沒當(dāng)回事,以為是有什么統(tǒng)計(jì)類的查詢,后來越來越頻繁2014-03-03