成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

系統(tǒng)重試,導(dǎo)致庫存扣多啦,怎么辦(兩行代碼破解)?

開發(fā) 架構(gòu)
大家有沒有遇到過,庫存異常的情況?接下來,就今天和大家聊一聊庫存扣減里的方案設(shè)計(jì)。

大家有沒有遇到過,庫存異常的情況:

  • 系統(tǒng)重試,導(dǎo)致庫存扣了多次;
  • 系統(tǒng)并發(fā),導(dǎo)致庫存設(shè)置錯(cuò)誤;

今天和大家聊一聊庫存扣減里的方案設(shè)計(jì)。

庫存微服務(wù)一般提供什么接口?

提供庫存的查詢、扣減、設(shè)置等RPC接口:

  • 庫存查詢接口,微服務(wù)一般執(zhí)行:
select num from stock where sid=$sid
  • 庫存扣減接口,微服務(wù)一般執(zhí)行:
update stock set num=num-$reduce where sid=$sid
  • 庫存設(shè)置接口,微服務(wù)一般執(zhí)行:
update stock set num=$num_new where sid=$sid

庫存操作,一般是什么業(yè)務(wù)場(chǎng)景?

用戶下單前,一般會(huì)對(duì)庫存進(jìn)行查詢,有足夠的存量才允許扣減:

如上圖所示,通過查詢接口,得到庫存是5。

用戶下單時(shí),接著會(huì)對(duì)庫存進(jìn)行扣減:

如上圖所示,購買3單位的商品,通過扣減接口,最終得到庫存是2。

簡(jiǎn)言之,一般是“先查后減”。

庫存“先查后減”會(huì)遇到什么問題?

系統(tǒng)往往有重試機(jī)制,這個(gè)重試機(jī)制可能實(shí)現(xiàn)在系統(tǒng)底層,例如:服務(wù)連接池重試,數(shù)據(jù)庫連接池重試,業(yè)務(wù)代碼不可控。

如果通過扣減接口來修改庫存,在重試時(shí)會(huì)導(dǎo)致重復(fù)扣減:

如上圖所示,try和retry,導(dǎo)致一次扣減執(zhí)行兩次,最終得到一個(gè)錯(cuò)誤庫存。

如何解決“重試導(dǎo)致庫存異?!钡膯栴}?

這里的根本原因:“reduce”操作是一個(gè)非冪等的操作,不能夠重復(fù)執(zhí)行,可以升級(jí)為“set”操作:

如上圖所示,同樣是購買3單位的商品,通過set操作,即使有重試機(jī)制,也不會(huì)得到錯(cuò)誤的庫存,“set”操作是一個(gè)冪等操作。

因此,應(yīng)該“先查后設(shè)”。

庫存“先查后設(shè)”會(huì)遇到什么問題?

并發(fā)量很大時(shí),還是可能導(dǎo)致庫存異常:

如上圖所示,兩個(gè)并發(fā)的操作,查詢庫存,都得到了庫存是5。

接下來多個(gè)用戶發(fā)生了并發(fā)的購買動(dòng)作:

畫外音:秒殺類業(yè)務(wù)特別容易出現(xiàn)。

如上圖所示:

  • 用戶1購買了3個(gè)庫存,庫存要設(shè)置為2;
  • 用戶2購買了2個(gè)庫存,庫存要設(shè)置為3;
  • 這兩個(gè)設(shè)置庫存的接口并發(fā)執(zhí)行,庫存會(huì)先變成2,再變成3,導(dǎo)致數(shù)據(jù)不一致(實(shí)際賣出了5件商品,但庫存只扣減了2,最后一次設(shè)置庫存會(huì)覆蓋和掩蓋前一次并發(fā)操作);

如何解決“并發(fā)導(dǎo)致庫存異?!钡膯栴}?

這里的根本原因:設(shè)置操作發(fā)生的時(shí)候,沒有檢查庫存與查詢出來的庫存有沒有變化,理論上:

  • 庫存為5時(shí),用戶1的庫存設(shè)置才能成功;
  • 庫存為5時(shí),用戶2的庫存設(shè)置才能成功;

實(shí)際執(zhí)行的時(shí)候:

  • 庫存為5,用戶1的set stock 2確實(shí)應(yīng)該成功;
  • 庫存變?yōu)?了,用戶2的set stock 3應(yīng)該失敗掉;

畫外音:有條件的成功。

接口實(shí)現(xiàn)優(yōu)化升級(jí),將庫存設(shè)置接口執(zhí)行的:

update stock set num=$y where sid=$sid

升級(jí)為:

update stock set num=$num_new where sid=$sid 
and num=$num_old

畫外音:加了一個(gè)初始條件比對(duì)。

簡(jiǎn)言之,“先查后設(shè),有條件的設(shè)”。

這正是大家常說的“Compare And Set”(CAS),是一種常見的降低讀寫鎖沖突,保證數(shù)據(jù)一致性的方法。

總結(jié)

  • “先查后減”,在重試,并發(fā)的場(chǎng)景下,容易出現(xiàn)異常;
  • “先查后設(shè)”,冪等性優(yōu)化,能夠解決重試的問題;
  • “先查后設(shè),有條件的射”,CAS優(yōu)化,能夠解決并發(fā)的問題;

知其然,知其所以然。

思路比結(jié)論更重要。

責(zé)任編輯:趙寧寧 來源: 架構(gòu)師之路
相關(guān)推薦

2013-03-05 17:11:27

Win 7操作系統(tǒng)藍(lán)屏

2023-09-12 14:58:00

Redis

2021-06-18 10:12:09

JS代碼前端

2017-06-15 08:02:02

庫存扣減查詢

2024-02-20 12:49:00

CSS函數(shù)前端

2022-07-14 10:23:39

數(shù)據(jù)

2022-09-25 23:10:53

Python數(shù)據(jù)集機(jī)器學(xué)習(xí)

2021-11-28 21:26:39

Windows 7Windows微軟

2024-06-12 15:59:59

前端JavaScrip識(shí)別

2022-05-17 07:35:13

安全Session

2018-03-15 13:31:48

潤(rùn)乾LinuxGREP搜索

2013-01-29 13:22:24

系統(tǒng)服務(wù)

2022-11-18 07:40:57

2021-05-08 23:33:12

iOS蘋果系統(tǒng)

2019-06-06 10:04:45

重構(gòu)代碼原代碼

2021-01-15 05:36:48

MySQL錯(cuò)位數(shù)據(jù)庫

2009-11-03 08:56:02

linux死機(jī)操作系統(tǒng)

2024-04-22 08:17:23

MySQL誤刪數(shù)據(jù)

2022-12-19 11:31:57

緩存失效數(shù)據(jù)庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美一级片在线观看 | 粉嫩高清一区二区三区 | 蜜桃视频在线观看免费视频网站www | www.久草 | 欧美午夜精品 | 国产精品欧美大片 | 99热精品在线 | 成人精品一区亚洲午夜久久久 | 91精品一区| 黄片毛片免费看 | www.日韩 | 亚洲久久一区 | 久久久久久国产精品免费免费狐狸 | 国产精品高潮呻吟久久aⅴ码 | 自拍中文字幕 | 国产电影一区二区在线观看 | 成人伊人 | 日韩一区二区三区视频在线播放 | 国产精品久久国产精品 | 男人的天堂久久 | 综合二区 | 91超碰在线观看 | 91成人免费观看 | 国产91在线观看 | 欧美一级免费看 | 日韩欧美在线视频播放 | 中文字幕亚洲欧美 | 日本黄色不卡视频 | 成人精品一区二区三区中文字幕 | 欧美激情 一区 | 免费视频一区二区 | 国产精品美女久久久 | 别c我啊嗯国产av一毛片 | 日韩三级电影一区二区 | 亚洲在线 | 国产夜恋视频在线观看 | 久久久国产精品视频 | 天堂色网 | 成人精品一区二区 | 日韩a视频| 精品成人一区二区 |