首先 并發(fā)我是這樣理解的:
2 個人同時下單, 庫存只有 1, 那么肯定有一個人無法搶到。也就是說, 庫存只會減 1, 訂單也只會生成一條。
后來我用 Jmemter 模擬 1000 人同時操作, 發(fā)現(xiàn)訂單確實只有一個, 而且?guī)齑嬉矝]有負(fù)數(shù), 但是我并沒有做什么鎖啊或者隊列這些一談到并發(fā)就會涉及到的東西。
$a
是查詢到的庫存
$b = $a-1;
if($b>=0){
生成訂單
修改庫存
}
如果沒有 if
判斷, 確實會負(fù)。但是如果加了這個 if
判斷就庫存只減少 1, 訂單只有一條
那么我的問題來了, 加個 if
判斷就能解決并發(fā)? 還是說實際上真正要處理的是模擬測試后出現(xiàn)的錯誤率 (Jmemter, 模擬 1000 人, error:59.5%), 或者其他?
請各位大佬解答, 如果我的思路有錯誤, 也請毫不留情
你說的訂單問題,其實是:高并發(fā)場景下,如何正確扣減庫存的問題if($b>=0)
這樣的判斷,在高并發(fā)的場景下并不使用,因為這樣的業(yè)務(wù)邏輯判斷并不是 原子操作
,所以存在 臟讀
的可能。
例如:
由兩個請求同時到達
服務(wù)端
(分別名為:p1
,p2
),p1
先取到了數(shù)據(jù),走到了if
判斷,
此時p2
也取到了數(shù)據(jù),但是p1
還沒有更新數(shù)據(jù)庫,所以p2
取到的數(shù)據(jù)跟p1
是一樣的,所以,p1
p2
得到的$b
值是一樣的,p2
也可以通過if
條件,但是這兩個請求只扣減了一次存庫。
如何解決這個問題呢?
加鎖;
隊列:改并行為串行,依次扣減;
操作轉(zhuǎn)換為原子操作;
不光是數(shù)據(jù)庫操作,高并發(fā)場景下,還可能會面對什么問題呢:
單點問題(當(dāng)然 非剛并發(fā)場景也會面臨這個問題,但是高并發(fā)場景,此問題尤為突出)
最大連接數(shù)問題,eg. web 服務(wù)器
數(shù)據(jù)庫
...
數(shù)據(jù)安全問題,eg. 臟讀
重復(fù)操作
實際中可能是這樣的,你的$a是查詢出來的對吧,有可能在高并發(fā)的場景下你走了if判斷但是沒有改變庫存的情況下,其他請求已經(jīng)在讀數(shù)據(jù)了,這個時候你讀到的$a就是沒減少庫存時候的狀態(tài)。這只是其中一點,最可怕的是如果你用的mysql數(shù)據(jù)庫,查詢和修改都會加鎖在并發(fā)很高的情況下可能會把表直接鎖死,其他的操作在等待中,一旦等待執(zhí)行時間過長、執(zhí)行過多,數(shù)據(jù)庫就掛掉了。還有你這個測試1000并發(fā)的時候使用的代碼并不是實際業(yè)務(wù)中的代碼,因為如果減庫存這種操作,肯定會有很多相關(guān)的邏輯判斷,1000個并發(fā)執(zhí)行起來就沒你想象的這么完美了。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。