掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
業(yè)務(wù)復(fù)雜、數(shù)據(jù)量大、并發(fā)量大的業(yè)務(wù)場景下,典型的互聯(lián)網(wǎng)架構(gòu),一般會分為這么幾層:

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、網(wǎng)站制作、左權(quán)網(wǎng)絡(luò)推廣、小程序開發(fā)、左權(quán)網(wǎng)絡(luò)營銷、左權(quán)企業(yè)策劃、左權(quán)品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供左權(quán)建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
對于庫存業(yè)務(wù),一般有個庫存服務(wù),提供庫存的查詢、扣減、設(shè)置等RPC接口:
- select num from stock where sid=$sid
- update stock set numnum=num-$reduce where sid=$sid
- update stock set num=$num_new where sid=$sid
用戶下單前,一般會對庫存進行查詢,有足夠的存量才允許扣減:
如上圖所示,通過查詢接口,得到庫存是5。
用戶下單時,接著會對庫存進行扣減:
如上圖所示,購買3單位的商品,通過扣減接口,最終得到庫存是2。
希望設(shè)計往往有容錯機制,例如“重試”,如果通過扣減接口來修改庫存,在重試時,可能會得到錯誤的數(shù)據(jù),導(dǎo)致重復(fù)扣減:
如上圖所示,如果數(shù)據(jù)庫層面有重試容錯機制,可能導(dǎo)致一次扣減執(zhí)行兩次,最終得到一個負數(shù)的錯誤庫存。
重試導(dǎo)致錯誤的根本原因,是因為“扣減”操作是一個非冪等的操作,不能夠重復(fù)執(zhí)行,改成設(shè)置操作則不會有這個問題:
如上圖所示,同樣是購買3單位的商品,通過設(shè)置庫存操作,即使有重試容錯機制,也不會得到錯誤的庫存,設(shè)置庫存是一個冪等操作。
在并發(fā)量很大的情況下,還會有其他的問題:
如上圖所示,兩個并發(fā)的操作,查詢庫存,都得到了庫存是5。
接下來用戶發(fā)生了并發(fā)的購買動作(秒殺類業(yè)務(wù)特別容易出現(xiàn)):
如上圖所示:
其根本原因是,設(shè)置操作發(fā)生的時候,沒有檢查庫存與查詢出來的庫存有沒有變化,理論上:
實際執(zhí)行的時候:
升級修改很容易,將庫存設(shè)置接口,stock-service上執(zhí)行的:
- update stock set num=$y where sid=$sid
升級為:
- update stock set num=$num_new where sid=$sid and num=$num_old
這正是大家常說的“Compare And Set”(CAS),是一種常見的降低讀寫鎖沖突,保證數(shù)據(jù)一致性的方法。
總結(jié)
在業(yè)務(wù)復(fù)雜,數(shù)據(jù)量大,并發(fā)量大的情況下,庫存扣減容易引發(fā)數(shù)據(jù)的不一致,常見的優(yōu)化方案有兩個:
【本文為專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流