? ? ? ?電商平臺下高并發(fā)經(jīng)典問題在實際的項目中需要積極的思考,高并發(fā)場景下接口冪等性则果,分布式事務(wù)幔翰,數(shù)據(jù)庫鎖,分布式事務(wù)西壮,樂觀鎖遗增,悲觀鎖,事務(wù)場景都是需要在實際項目中進行思考和提出解決方案款青。本文就講項目中遇到的問題一一做詳細分析和尋找解決方案做修。
接口冪等性定義和解決方案
? ? ? (1)定義:
? ? 什么是接口的冪等性,如果是第一次聽到的小伙伴可以簡要的閱讀下,在java開發(fā)中接口的冪等性主要講的是接口在1次和多次調(diào)用的系統(tǒng)的數(shù)據(jù)影響是一樣的缓待。
? ? ? 接口的冪等性實際上就是接口可重復(fù)調(diào)用蚓耽,在調(diào)用方多次調(diào)用的情況下,接口最終得到的結(jié)果是一致的旋炒。有些接口可以天然的實現(xiàn)冪等性步悠,比如查詢刪除接口,但是插入更新接口等需要考慮接口冪等性瘫镇,
? ? ? ? (2)場景:
????一個訂單創(chuàng)建接口鼎兽,第一次調(diào)用超時了,然后調(diào)用方重試了一次
????在訂單創(chuàng)建時铣除,我們需要去扣減庫存谚咬,這時接口發(fā)生了超時,調(diào)用方重試了一次
????當(dāng)這筆訂單開始支付尚粘,在支付請求發(fā)出之后择卦,在服務(wù)端發(fā)生了扣錢操作,接口響應(yīng)超時了郎嫁,調(diào)用方重試了一次
????一個訂單狀態(tài)更新接口秉继,調(diào)用方連續(xù)發(fā)送了兩個消息,一個是已創(chuàng)建泽铛,一個是已付款尚辑。????但是你先接收到已付款,然后又接收到了已創(chuàng)建
????在支付完成訂單之后盔腔,需要發(fā)送一條短信杠茬,當(dāng)一臺機器接收到短信發(fā)送的消息之后,處理較慢弛随。消息中間件又把消息投遞給另外一臺機器處理
? ? ? ? (3)解決方案:
? ? ? ? 1瓢喉、去重表
? ? ? ?去重表設(shè)計思路主要講的是更新或者插入數(shù)據(jù)之前先在去重表中插入一條記錄,并按照數(shù)據(jù)內(nèi)容設(shè)計唯一索引舀透,這樣如果接口已經(jīng)調(diào)用一次重復(fù)調(diào)用就會引發(fā)鍵值重復(fù)灯荧,異常處理中可以作重復(fù)相關(guān)處理或者引發(fā)數(shù)據(jù)異常數(shù)據(jù)回滾。
? ? ? ?2盐杂、全局唯一ID
? ? ? ?如果使用全局唯一ID,就是根據(jù)業(yè)務(wù)的操作和內(nèi)容生成一個全局ID哆窿,在執(zhí)行操作前先根據(jù)這個全局唯一ID是否存在链烈,來判斷這個操作是否已經(jīng)執(zhí)行。如果不存在則把全局ID挚躯,存儲到存儲系統(tǒng)中强衡,比如數(shù)據(jù)庫、redis等码荔。
? ? ? 但是如果存儲在數(shù)據(jù)庫中如果按照select+update可能會發(fā)生并發(fā)問題漩勤,需要特別注意感挥,如果這種場景下需要考慮分布式鎖或者采用同步機制。如存在數(shù)據(jù)庫中在插入時重復(fù)插入就會發(fā)生異吃桨埽回滾触幼。
? ? ? 更新時按照唯一鍵值進行更新,但是需要注意的是在更新操作下可能會發(fā)生重復(fù)操作究飞,例如設(shè)置訂單狀態(tài)支付成功和創(chuàng)建兩個操作可能會重復(fù)執(zhí)行置谦,需要結(jié)合數(shù)據(jù)庫字段或者狀態(tài)機實現(xiàn)功能。
? ? 3亿傅、數(shù)據(jù)庫字段約束
數(shù)據(jù)庫字段約束主要用版本號控制媒峡,狀態(tài)機約束,字段約束葵擎,其實從整個的實現(xiàn)思路來說都是采用數(shù)據(jù)庫字段進行做文章谅阿。
a、版本號控制主要用于并發(fā)情況下做扣減或者或者操作數(shù)據(jù)酬滤,如果沒有版本號兩個并發(fā)操作會出現(xiàn)讀取到數(shù)據(jù)一致签餐,但是扣減之后本來處理的扣將兩次操作的和但是現(xiàn)在值是最后一個操作的值,加了版本號就會防止這種情況發(fā)生
b敏晤、只有在某種字段滿足特定條件的情況下才能進行指定字段的處理贱田,例如在狀態(tài)為未支付的情況下才能進行金額扣減,需要在數(shù)據(jù)庫where字段中進行處理嘴脾。
c男摧、狀態(tài)機思路在電商訂單流轉(zhuǎn)或者在狀態(tài)機很復(fù)雜情況下才能進行,思路就是利用有限狀態(tài)機在各個情況下狀態(tài)變更需要依賴制定狀態(tài)機流轉(zhuǎn)译打,滿足有效狀態(tài)機才能進行狀態(tài)變更耗拓,另外采用有限狀態(tài)機可以統(tǒng)一管狀態(tài)變更,而不是把狀態(tài)變化分散到各個部分不便于管理奏司。
本節(jié)到此乔询,下次分享電商平臺高并發(fā)思考-事務(wù)(2)