精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

并發-分布式鎖質量保障總結

原創
開發
由于當前互聯網都是分布式系統,因此本文只針對使用較為廣泛的分布式鎖的方式來進行敘述如何進行質量保障。

一、背景

并發問題是電商系統最常見的問題之一,例如庫存超賣、抽獎多發、券多發放、積分多發少發等場景;之所以會出現上述問題,是因為存在多機器多請求同時對同一個共享資源進行修改,如果不加以限制,將導致數據錯亂和數據不一致性;解決并發問題的方式有很多,例如:隊列、異步、響應式、鎖都可以;由于當前互聯網都是分布式系統,因此本文只針對使用較為廣泛的分布式鎖的方式來進行敘述如何進行質量保障。

二、分布式鎖介紹

1. 什么是分布式鎖

先了解一下什么是鎖,在單機系統中,多個線程同時改變一個變量時,需要對變量或者代碼塊做同步從而保證串行修改變量,該同步實質上就是通過鎖來實現。為了實現多個線程在同一個時刻針對同一塊代碼串行執行,就需要在某個地方做個標記,該標記必須每個線程都能看到,當標記不存在時可以設置該標記,其余后續線程發現已經有標記了則等待擁有標記的線程結束同步代碼塊取消標記后再去嘗試設置標記,此標記可以理解為鎖。分布式鎖就是在多機系統下的該標記。

2. 實現分布式鎖的主流方式

目前分布式鎖的實現方式有3種主流方法,即:

(1) 基于數據庫實現分布式鎖,此處的數據庫指的是MySQL關系型數據庫

  • 基于MySQL鎖表
  • 數據庫版本號樂觀鎖

(2) 基于緩存實現分布式鎖,此處的緩存指的是Redis

(3) 基于zookeeper/etcd實現分布式鎖

具體的關于鎖的實現方式,已經有太多的文章進行介紹,本文就不再贅述。

三、質量保障

并發問題一旦涉及到錢,通常都會導致不同程度的資損,而且在我們的功能測試中是很難發現,因此對于并發的質量保障顯得尤為的重要,可以抽象為3層來保障:事前、事中、事后三大步驟;事前保障通過Review 方式提前規避技術上的風險,事中保障驗證在技術實現過程中是否存在漏洞,事后保障校驗數據是否符合預期,對于有并發風險的項目上述三個步驟的保障缺一不可。

1. 事前質量保障

事前保障的階段發生在技術評審階段,在此階段,我們需要評估出當前業務場景下是否存在并發風險;如果存在,確定我們的技術選型。

評估并發風險

評估并發風險的關鍵點在于是否存在多個進程同時訪問共享資源,簡單來說是否存在多個進程在同一時間對同一個數據進行更新的操作;例如:電商中的庫存,多人同時購買同一個商品,也就是會存在同一時間對同一個商品的庫存進行更新,此處就存在并發風險。

技術選型

要做到正確的技術選型,我們就需要對上述種方式實現的鎖的優缺點以及應用場景需要進行了解。

MySQL數據庫表的樂觀鎖適用于讀多寫少的場景且共享資源為數據庫的單行數據;MySQL表鎖實現的鎖一般都不推薦使用;ZooKeeper分布式鎖雖然適用于大部分分布式場景,但是由于其實現復雜度相對較高以及需要額外引入中間件,在大部分業務場景中的應用比較少,而基于Redis的緩存分布式鎖應用較為廣泛;但是具體業務實現采用哪種類型的分布式鎖,還是需要基于當前的業務特性來進行決定;

在技術評審階段,一方面我們要評估出是否存在并發風險,另外一方面,我們需要識別開發同學在技術的實現上可能存在的漏洞,針對分布式鎖的實現漏洞可參考下文的CodeReview的關注點。

2. 事中保障

CodeReview

(1) Redis緩存分布式鎖

Redis通常可以使用setnx(key,value)函數來實現分布式鎖。key和value就是基于緩存的分布式鎖的兩個屬性,其中key表示鎖id。setnx函數返回1表示獲得鎖,返回0表示其他服務器已經獲得了鎖;

Redis緩存分布式鎖CodeReview注意點:

1)Redis Key

  • 全面梳理業務場景,對于同一共同資源,key要保持一致;
  • key是識別共享資源的唯一鍵,key的設計既需要能夠鎖住當前共享資源又不能影響到其他資源;

例如:商品庫存,我們的key應該是具體到某個商品,而不是所有商品,鎖住A商品,不會影響B商品。

2)鎖釋放

  • 鎖一定需明確釋放,try/finally 結構加鎖解鎖,finally內釋放鎖;
  • 鎖只能被加鎖的對象釋放,此處是經常出問題的點,如下圖所示,A加鎖被B釋放鎖,導致鎖失效,鎖被C搶占到;

針對上述問題,釋放鎖時需要先讀取當前key的value,再和傳入的value進行比較;上述是兩個步驟一定要保證原子性,如果原生Redis可采用lua腳本保證原子性;如果tair,可采取TairString的cad方法;value必須是一個唯一值,唯一標記是當前對象加的鎖。

3)鎖超時

a. 一定要設置key的超時時間;例如:客戶端A 搶到鎖后,系統突然異常,A就無法釋放鎖,變成死鎖;設置超時時間就是為了防止此種情況發生,在時間到期后,自動刪除key,間接釋放鎖;

b. 超時時間的設置一般來講大于服務的最大執行時間即可,但是服務最大的執行時間會受很多因素影響,是不可控的;例如:A服務一般執行時間是30ms,設置的鎖超時時間為100ms,受網絡影響服務執行時間變成了200ms,在100ms的時候鎖就會被釋放了;在大部分場景下,開發不會處理此種情況,此種極端情況是否需要處理,需要進行協商;處理方式如下兩種:

  • 可以再開啟一個線程,為當前超時時間續時,但增加了系統的復雜度;
  • 將過期時間設置非常長,一定能保證邏輯在鎖釋放之前能夠執行完成;此方案簡單但是有缺陷,當遇到系統突發異常時,鎖無法被釋放,只能等待redis key超時,而超時時間又設置的較長,因此在當前時間內誰都無法獲取到鎖,阻斷業務執行,很有可能造成故障;

4)鎖粒度

如果針對某個共享資源的寫是基于另外一個共享資源的值計算而來,那么鎖的范圍必須包含讀共享資源;范圍不包含讀共享資源會導致臟讀,最終導致數據的錯誤,如下圖所示,Client B最終計算的B的結果就是錯誤的。

5)獲取鎖失敗

由于其他線程已經獲取到了鎖,當前線程獲取鎖失敗后有3種處理方式:異常拋出讓用戶重試;通過自旋再次進行搶鎖;發布訂閱,訂閱鎖釋放消息;在并發度低的場景下異常拋出以及自旋搶鎖都可以,在高并發場景下異常拋出和自旋搶鎖都不可取。

(2) MySQL數據庫鎖CR點

1)數據庫版本號樂觀鎖

在數據庫的表中需要包含一個數字類型的字段version,讀取數據時把version字段讀出來,更新數據時判斷當前version是否等于讀取出來的version,并對當前version+1;如果等于就更新成功,不等于表示數據已過期更新失敗。例如以積分體系為例,存在多種場景增加積分,通過樂觀鎖來保證數據的正確性。

樂觀鎖CR注意點:

  • where 條件一定要命中索引(最好是主鍵或者唯一索引),否則會鎖表;
  • update table set 中必須要包含version = version + 1;
  • update 返回結果為0時,一定要根據業務場景進行相應的處理,自主重試或者拋異常;

2)基于MySQL鎖表

其實現原理是:創建一張鎖表,對臨界資源做唯一性約束,通過增加一條記錄對某一資源上鎖,釋放鎖時刪除記錄;一般不推薦此種用法。

并發測試

并發測試總體上可以分為三大類:

(1) 復雜的并發場景,一次請求共享資源存在多個,且前后存在各種依賴關系,此種場景適合于鏈路級別壓測,壓測模型需要精心設計。

(2) 單一并發場景,一個共享資源,可以處理多次,例如:扣除某個商品的庫存,可以反復調用。

  • 可以通過接口壓測的方式進行測試,通過查看最終數據是否會存在與預期不一致情況即可;
  • 壓測工具:jmeter 即可進行壓測(集團可直接采用pas-server進行壓測,方便快捷);

(3) 單一并發場景,一個共享資源,且只能處理1次,例如:用戶只有一次抽獎機會,連續點2次會不會抽2次;

  • 可以利用JVM的并發函數CountDownLatch,CyclicBarrier等,CountDownLatch片段代碼:
    public void invokeAllTask(ConcurrencyRequest request, Runnable task) {
final CountDownLatch startCountDownLatch = new CountDownLatch(1);
final CountDownLatch endCountDownLatch = new CountDownLatch(request.getConcurrency());
for (int i = 0; i < request.getConcurrency(); i++) {
Thread t = new Thread(() -> {
try {
startCountDownLatch.await();
try {
task.run();
} finally {
endCountDownLatch.countDown();
}
} catch (Exception ex) {
log.error("異常", ex);
}
});
t.start();
}
startCountDownLatch.countDown();
try {
endCountDownLatch.await();
} catch (InterruptedException ex) {
log.error("線程異常中斷", ex);
}
}

  • 利用jmeter的定時器 Synchronizing Timer也可以實現此功能。

3. 事后保障

數據對賬

數據對賬(數據一致性校驗)是我們在系統上線后對并發問題的最后一道防線,通過對賬來識別我們的數據的不一致性問題;壓測有成本,且受技巧熟練度和壓測設計的影響,不一定能暴露問題;如果被測場景評估并發問題的發生概率極低,即使發生了影響也比較小,此時review+對賬方式也不失為一種好的選擇;

如何進行對賬,不同的業務場景有不同的對賬方法,例如:

  • 互動積分體系每個用戶的扣除以及增加積分都會落流水表;每個用戶目前有多少積分都會放在積分表;只需要把流水表的積分加總和積分表的積分進行對賬;
  • 互動任務體系,一筆訂單只能推進一個任務,對賬只需要檢查任務記錄中一筆訂單是否存在多條記錄;
select count(*)  as task_count,
scene_code,
order_id
from task_record
where unique_id is not null
group by scene_code,
order_id
having count(*)> 1

四、總結

作為質量保障同學一定要時刻繃著一根弦,當前場景下是否會存在并發問題;并發問題的識別簡單而言就是是否存在同時更新同一個數據,如果是就一定要注意開發同學是否處理了并發,并發的實現主要是上面闡述的幾種,然后按照場景進行分析即可;關于并發場景的質量保障,大體原則可以概括為如下:

  • 梳理并發場景
  • 帶著注意點CR 代碼
  • 并發測試(非銀彈,不是所有場景都具備可測性)
  • 監控對賬進行兜底識別并發問題
責任編輯:趙寧寧 來源: 阿里開發者
相關推薦

2022-03-07 08:14:27

并發分布式

2024-11-06 12:29:02

2019-06-19 15:40:06

分布式鎖RedisJava

2025-05-07 02:15:00

分布式鎖高并發UUID鎖

2018-07-17 08:14:22

分布式分布式鎖方位

2021-07-16 07:57:34

ZooKeeperCurator源碼

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2022-08-04 08:45:50

Redisson分布式鎖工具

2018-11-27 16:17:13

分布式Tomcat

2021-11-26 06:43:19

Java分布式

2021-07-10 10:02:30

ZooKeeperCurator并發

2017-09-22 12:08:01

數據庫分布式系統互聯網

2021-12-01 10:13:48

場景分布式并發

2021-12-28 17:03:29

數據質量分布式

2022-01-12 12:46:32

Go限流保障

2023-09-22 08:00:00

分布式鎖Redis

2022-01-06 10:58:07

Redis數據分布式鎖

2021-10-25 10:21:59

ZK分布式鎖ZooKeeper

2023-08-21 19:10:34

Redis分布式

2017-10-24 11:28:23

Zookeeper分布式鎖架構
點贊
收藏

51CTO技術棧公眾號

美女福利视频网| 婷婷中文字幕在线观看| 青青青手机在线视频观看| 久热精品在线| 久久国产精品久久国产精品| 国产伦精品一区三区精东| 亚洲国产成人二区| 综合欧美一区二区三区| 国产精品久久久久久久久婷婷| 国产精品久久久久久人| 在线精品国产| 国产亚洲精品一区二区| 在线成人精品视频| 日韩和的一区二在线| 亚洲男女一区二区三区| 免费国产在线精品一区二区三区| 91久久久久国产一区二区| 亚洲国产网站| 日韩中文视频免费在线观看| 高清中文字幕mv的电影| 国产成人精品一区二区三区在线| 亚洲一区二区欧美| 亚洲人成人77777线观看| 国产亲伦免费视频播放| 久久在线精品| 97香蕉久久夜色精品国产| 黑人狂躁日本娇小| 亚洲精品亚洲人成在线观看| 欧美一区二区三区视频| 韩国日本美国免费毛片| 色是在线视频| 一区二区三区四区五区视频在线观看| 日韩精品无码一区二区三区| 免费观看黄一级视频| 久久精品国产久精国产| 欧美亚洲激情在线| 精品在线视频免费| 欧美影院一区| 久久国产精品久久久久久久久久| 五月婷六月丁香| 最近国产精品视频| 亚洲精品自拍视频| 国产精品九九视频| av综合网页| 欧美变态凌虐bdsm| 永久看看免费大片| 免费观看亚洲视频大全| 欧美一卡二卡在线| 第一区免费在线观看| 欧美网站免费| 欧美日韩国产高清一区二区| 久久国产乱子伦免费精品| 中国字幕a在线看韩国电影| 亚洲aⅴ怡春院| 全黄性性激高免费视频| 第四色日韩影片| 亚洲制服丝袜av| 97超碰国产精品| heyzo在线播放| 亚洲国产成人精品视频| 中文精品无码中文字幕无码专区| 亚洲婷婷噜噜| 亚洲午夜私人影院| 性一交一乱一伧国产女士spa| 日韩特级毛片| 午夜精品一区二区三区免费视频| 狠狠干 狠狠操| 日本在线啊啊| 色婷婷久久久亚洲一区二区三区| 色婷婷综合久久久久中文字幕 | 中文在线一区二区| 亚洲精品人成| 成人影院在线看| 亚洲精品免费播放| 欧美视频在线观看视频| 依依综合在线| 欧美日韩中文国产| 尤物网站在线看| 乱中年女人伦av一区二区| 亚洲精品一二区| 日日操免费视频| 欧美午夜在线视频| 45www国产精品网站| 中文字幕av片| 国产成人精品影视| 看欧美日韩国产| 麻豆电影在线播放| 亚洲国产精品久久人人爱蜜臀| 国产肥臀一区二区福利视频| 九九久久国产| 亚洲第一精品自拍| 日本免费www| 国内精品久久久久国产盗摄免费观看完整版 | 99热这里只有精品8| 国产精品第一第二| 国产成人免费看一级大黄| 97se亚洲国产综合在线| 亚洲午夜高清视频| 国产va在线视频| 欧美二区在线观看| 美国黄色一级毛片| 亚洲欧美网站在线观看| …久久精品99久久香蕉国产| 亚洲最新av网站| 99re在线视频这里只有精品| 一区二区不卡在线| 成人免费观看在线观看| 欧美剧情电影在线观看完整版免费励志电影| 中文字幕55页| 精品一区二区三| 性欧美亚洲xxxx乳在线观看| 国产一区二区三区三州| 久久综合久久综合久久综合| 亚洲欧美日韩不卡| 亚洲高清黄色| 精品成人免费观看| 岛国毛片在线观看| 麻豆精品在线观看| 鲁鲁狠狠狠7777一区二区| 人妖欧美1区| 777色狠狠一区二区三区| 蜜桃无码一区二区三区| 亚洲麻豆一区| 国产91免费视频| av文字幕在线观看| 欧美精品自拍偷拍| 99久久99久久精品免费看小说.| 一区二区自拍| 成人欧美一区二区三区视频| 成码无人av片在线观看网站| 欧美挠脚心视频网站| 香蕉视频久久久| 乱码第一页成人| 久久精品99久久| jizzjizz中国精品麻豆| 日韩美女视频在线| 久久99久久99精品免费看小说| 日本人妖一区二区| 欧美在线激情| 精品欧美日韩精品| 夜夜嗨av一区二区三区四区| 色一情一乱一伦| 2021国产精品久久精品| 国产黄视频在线| 巨人精品**| 97成人精品视频在线观看| 亚洲国产精品久久人人爱潘金莲| 亚洲女女做受ⅹxx高潮| 99国产精品免费视频| 亚洲女同中文字幕| 高清一区二区三区视频| 欧美理论片在线播放| 精品美女在线观看| 色婷婷在线观看视频| 92国产精品观看| 欧美牲交a欧美牲交aⅴ免费下载| 亚洲传媒在线| 国产精品久久久久影院日本 | 久久国产精品久久久| 99精品国产99久久久久久97| 亚洲最新视频在线观看| 国产精品无码在线| 久久一区二区三区四区五区 | 国产精品一区二区在线观看| 91美女精品| 日韩精品在线私人| 日本熟妇一区二区三区| 国产精品毛片久久久久久| 中文字幕线观看| 国一区二区在线观看| 国产乱码精品一区二区三区中文| 欧美gv在线| 色哟哟亚洲精品一区二区| 国产精品欧美亚洲| 亚洲国产婷婷综合在线精品| 国产福利短视频| 麻豆免费看一区二区三区| 国产911在线观看| 欧洲在线一区| 国产这里只有精品| www.8ⅹ8ⅹ羞羞漫画在线看| 亚洲色无码播放| 国产精品嫩草影院桃色| 婷婷中文字幕一区三区| 亚洲欧美va天堂人熟伦| 国产精品69毛片高清亚洲| 免费看一级大黄情大片| 午夜av一区| 鲁丝片一区二区三区| 91成人小视频| 欧美自拍大量在线观看| а√资源新版在线天堂| 亚洲精品日韩欧美| 999久久久久久| 色哟哟一区二区| 青娱乐91视频| 国产三级精品视频| 亚洲少妇中文字幕| 蜜桃精品在线观看| 欧美 日本 亚洲| 亚洲中无吗在线| 久热国产精品视频一区二区三区| 91亚洲精品在看在线观看高清| 欧美一性一乱一交一视频| 18av在线播放| 一区二区三区四区精品| 色哟哟中文字幕| 欧美精品日日鲁夜夜添| 亚洲成熟少妇视频在线观看| 亚洲一区二区三区在线播放| 国产jizz18女人高潮| 91丨porny丨首页| 能看毛片的网站| 美国三级日本三级久久99| 久色视频在线播放| 欧美不卡一区| 视频一区二区视频| 日韩电影一区| 日韩欧美在线观看强乱免费| 日韩高清电影免费| 99re在线播放| 日本精品视频| 成人精品一区二区三区电影免费| 精品3atv在线视频| 97欧美精品一区二区三区| 污污影院在线观看| 久久色在线播放| 色的视频在线免费看| 一区二区三区www| 毛片免费在线播放| 精品亚洲一区二区三区在线观看| 国产91久久久| 日韩欧美成人午夜| 国产sm主人调教女m视频| 欧美日韩另类国产亚洲欧美一级| 中文字幕在线看人| 欧美特级www| 国产乡下妇女做爰视频| 亚洲福利电影网| 国产一级生活片| 亚洲国产精品天堂| 日韩乱码在线观看| 激情成人中文字幕| 日韩视频免费观看高清| 亚洲国产综合色| 国产精品成人久久| 亚洲h精品动漫在线观看| 日本五十熟hd丰满| 精品国产精品三级精品av网址| 日韩av综合在线| 欧美日韩国产一区二区三区| 国产精品成人久久| 色综合天天在线| 亚洲午夜无码久久久久| 欧美日韩精品一区二区天天拍小说 | 国产午夜手机精彩视频| 亚洲欧美日韩中文字幕一区二区三区 | 视频精品一区| 国产精品日本一区二区| 精品资源在线| 欧美一区二区三区四区夜夜大片| 欧洲福利电影| av电影一区二区三区| 综合视频在线| 国产欧美日韩网站| 久久久www| 亚洲av无日韩毛片久久| 国产99一区视频免费| 99久久人妻精品免费二区| 久久久www成人免费毛片麻豆| 国产又粗又长免费视频| **性色生活片久久毛片| 久热精品在线观看| 91久久精品网| 国产成人精品无码高潮| 亚洲精品久久久久中文字幕二区| 理论视频在线| 久久精品国产亚洲7777| 888av在线视频| 日韩免费观看在线观看| 99久久99九九99九九九| 狠狠色狠狠色综合人人| 欧美精品色图| 福利在线一区二区| 日本vs亚洲vs韩国一区三区二区| 中文字幕一二三| 26uuu精品一区二区| 麻豆网址在线观看| 午夜精品在线看| 夜夜躁狠狠躁日日躁av| 亚洲国产精品人人爽夜夜爽| www在线播放| 欧美精品九九久久| 小明成人免费视频一区| 国产精品美女诱惑| 日韩综合在线| 免费欧美一级视频| 国产一区二区三区四区五区美女| 欧美做受喷浆在线观看| 亚洲欧美日韩中文播放| 一级黄色av片| 亚洲成人中文字幕| 日本福利专区在线观看| 久久久噜噜噜久久久| 欧美精品总汇| 精品一区久久| 狠狠色综合网| 在线免费黄色网| 国产亚洲欧美色| 日韩欧美不卡视频| 欧美一区二区在线播放| 爱爱爱免费视频在线观看| 久久久中精品2020中文| 伊人久久大香线蕉综合影院首页| 久久伊人一区二区| 亚洲视频久久| 国产高清999| 国产精品伦一区二区三级视频| 成年人免费看毛片| 欧美大片在线观看| 国产网站在线免费观看| 国产精品一区二区三区久久久| 一区三区在线欧| 黄色免费视频大全| 成人性视频免费网站| 欧美精品久久久久久久久46p| 欧美性受xxxx黑人xyx| 国产在线自天天| 庆余年2免费日韩剧观看大牛| 成人在线超碰| www.日本在线视频| 国产成人自拍网| 91在线播放观看| 欧美二区乱c少妇| 日本高清视频在线播放| 国产精品综合久久久| 欧美日中文字幕| 天天爱天天操天天干| 欧美极品少妇xxxxⅹ高跟鞋| 欧美高清69hd| 在线亚洲欧美视频| 成人在线视频免费| 亚洲欧洲日韩精品| 精品写真视频在线观看 | 91精品一区国产高清在线gif | 伦av综合一区| 亚洲免费成人av电影| 一级毛片久久久| 日韩免费一区二区三区| 蜜臀91精品一区二区三区| 精品一区二区三孕妇视频| 欧美视频自拍偷拍| 天堂资源在线中文| 91丨九色丨国产在线| 亚洲色图国产| 韩国av中国字幕| 激情亚洲一区二区三区四区| 青青草视频免费在线观看| 国产成人中文字幕| 日韩欧美一区免费| 成年人网站av| 精品福利在线视频| 免费在线一级视频| 国产精品一区二区久久| 亚洲国产一区二区三区在线播放| 古装做爰无遮挡三级聊斋艳谭| 亚洲线精品一区二区三区 | 色偷偷噜噜噜亚洲男人| 国产一区二区三区免费观看在线| 成人短视频在线观看免费| 99视频有精品| 中文字幕乱伦视频| 色综合久久久888| 日韩av中文字幕一区| 成人免费视频久久| 亚洲人妖av一区二区| 日本黄色大片视频| 国产精品极品美女在线观看免费| 日韩国产一区二区三区| 国产在线a视频| 欧美日韩另类在线| 午夜免费播放观看在线视频| av一区二区三区四区电影| 免费视频一区| 欧美精品久久久久久久久46p| 亚洲国产精品资源| 久久亚洲国产精品尤物| 欧美激情视频免费看| 国产精品私人影院| 日韩性xxxx| 91精品视频大全| 久久精品九九| 精品无码久久久久| 怡红院精品视频| 老司机凹凸av亚洲导航| 中文字幕av不卡在线| 亚洲成a人在线观看| 视频一区二区三区不卡 | 91偷拍一区二区三区精品| 国产激情视频网站|