日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

后端|一個(gè)分布式鎖「失效」的案例分析

來源: 責(zé)編: 時(shí)間:2023-09-22 20:12:59 425觀看
導(dǎo)讀小猿最近很苦惱:明明加了分布式鎖,為什么并發(fā)還是會(huì)出問題呢?故事從接到需求開始說起。接到需求小猿前一陣接到一個(gè)小任務(wù),里面有一個(gè)功能對(duì)應(yīng)的場(chǎng)景如下:封裝一個(gè)對(duì)賬戶余額進(jìn)行加減操作的方法;所屬服務(wù)部署了多個(gè)實(shí)例;這個(gè)

小猿最近很苦惱:明明加了分布式鎖,為什么并發(fā)還是會(huì)出問題呢?lLA28資訊網(wǎng)——每日最新資訊28at.com

故事從接到需求開始說起。lLA28資訊網(wǎng)——每日最新資訊28at.com

lLA28資訊網(wǎng)——每日最新資訊28at.com

接到需求

小猿前一陣接到一個(gè)小任務(wù),里面有一個(gè)功能對(duì)應(yīng)的場(chǎng)景如下:lLA28資訊網(wǎng)——每日最新資訊28at.com

  • 封裝一個(gè)對(duì)賬戶余額進(jìn)行加減操作的方法;
  • 所屬服務(wù)部署了多個(gè)實(shí)例;
  • 這個(gè)方法可能會(huì)有并發(fā)調(diào)用。

注:實(shí)際業(yè)務(wù)場(chǎng)景比較復(fù)雜,已做簡(jiǎn)化。lLA28資訊網(wǎng)——每日最新資訊28at.com

小猿略作思考,就抓住了關(guān)鍵點(diǎn):余額操作——要注意事務(wù),多實(shí)例——要注意并發(fā)。lLA28資訊網(wǎng)——每日最新資訊28at.com

小猿的原始代碼如下:lLA28資訊網(wǎng)——每日最新資訊28at.com

@Override@Lock(key = "#accountNo")@Transactional(rollbackFor = Exception.class)public void updateBalance(String accountNo, AmountOperateParam param) {    // do something}

可以看到,這個(gè)方法上通過注解方式加了分布式鎖和事務(wù),鎖的 key 是 accountNo,也就是賬戶業(yè)務(wù)主鍵。lLA28資訊網(wǎng)——每日最新資訊28at.com

自測(cè)和測(cè)試也沒發(fā)現(xiàn)啥問題,就高高興興發(fā)完版回家了。lLA28資訊網(wǎng)——每日最新資訊28at.com

出問題了

第二天一早,就接到少量用戶反饋,說自己的賬戶余額不對(duì)了。lLA28資訊網(wǎng)——每日最新資訊28at.com

小猿的第一反應(yīng)是:我這塊自測(cè)和測(cè)試都沒問題,其它功能導(dǎo)致的吧?本地又是一通自測(cè),也沒有復(fù)現(xiàn)問題。但謹(jǐn)慎起見,還是往代碼里加了一些日志,來確認(rèn)是不是自己的方法引發(fā)的。lLA28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)又有用戶反饋時(shí),小猿根據(jù)日志的情況確認(rèn)了:還真是自己方法的問題,對(duì)同一個(gè)賬戶的余額操作,多個(gè)并發(fā)請(qǐng)求會(huì)同時(shí)執(zhí)行到方法體里面。lLA28資訊網(wǎng)——每日最新資訊28at.com

也就是說……分布式鎖沒鎖住?lLA28資訊網(wǎng)——每日最新資訊28at.com

冥思苦想了好久,又在本地做了大量的測(cè)試,終于讓小猿找到了問題所在:AOP 執(zhí)行順序問題。lLA28資訊網(wǎng)——每日最新資訊28at.com

小猿設(shè)計(jì)的時(shí)序:lLA28資訊網(wǎng)——每日最新資訊28at.com

lLA28資訊網(wǎng)——每日最新資訊28at.com

但實(shí)際的時(shí)序:lLA28資訊網(wǎng)——每日最新資訊28at.com

lLA28資訊網(wǎng)——每日最新資訊28at.com

也就是說期望是這樣的執(zhí)行順序:lLA28資訊網(wǎng)——每日最新資訊28at.com

lLA28資訊網(wǎng)——每日最新資訊28at.com

但實(shí)際的執(zhí)行順序:lLA28資訊網(wǎng)——每日最新資訊28at.com

lLA28資訊網(wǎng)——每日最新資訊28at.com

分布式鎖和事務(wù),都是通過 AOP 來實(shí)現(xiàn)的,而 AOP 的執(zhí)行順序是根據(jù)切面的優(yōu)先級(jí)來的,而小猿的分布式鎖切面的優(yōu)先級(jí)比事務(wù)切面的優(yōu)先級(jí)低,所以就出現(xiàn)了上面的時(shí)序問題。lLA28資訊網(wǎng)——每日最新資訊28at.com

于是通過給分布式鎖的切面指定 Order 的方式,讓它的優(yōu)先級(jí)高于事務(wù)切面(注:Order 值越小,執(zhí)行優(yōu)先級(jí)越高),驗(yàn)證完沒問題后,就又高高興興地更新完版本,修復(fù)好歷史問題數(shù)據(jù)后回家了。lLA28資訊網(wǎng)——每日最新資訊28at.com

還有問題

誰(shuí)知道第二天一早,還是有極少量的用戶反饋賬戶余額不對(duì)的問題。lLA28資訊網(wǎng)——每日最新資訊28at.com

這次小猿就有點(diǎn)懵了,為什么還會(huì)出現(xiàn)這種情況呢?lLA28資訊網(wǎng)——每日最新資訊28at.com

經(jīng)過一番艱苦卓絕的排查,終于找到了問題所在:事務(wù)嵌套。lLA28資訊網(wǎng)——每日最新資訊28at.com

從前文中的示例代碼中可以看到,小猿的方法上加了事務(wù)注解 @Transactional(rollbackFor = Exception.class) 里,沒有指定事務(wù)的傳播行為,默認(rèn)是 Propagation.REQUIRED,也就是說如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù);如果當(dāng)前有事務(wù),就加入到當(dāng)前事務(wù)中。lLA28資訊網(wǎng)——每日最新資訊28at.com

小猿自己寫的代碼里沒有在事務(wù)方法里嵌套調(diào)用這個(gè)方法的情況,但是同事寫的代碼里有,這樣就會(huì)導(dǎo)致前文的時(shí)序問題再次發(fā)生。lLA28資訊網(wǎng)——每日最新資訊28at.com

找到問題就好辦了,小猿將自己的方法上的事務(wù)傳播行為改成了 Propagation.REQUIRES_NEW,也就是說如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù);如果當(dāng)前有事務(wù),就將當(dāng)前事務(wù)掛起,新建一個(gè)事務(wù)。lLA28資訊網(wǎng)——每日最新資訊28at.com

這次更新完版本后,小猿就再也沒有收到用戶反饋了,終于可以安心回家睡覺了。lLA28資訊網(wǎng)——每日最新資訊28at.com

小結(jié)

在日常的開發(fā)過程中,如果涉及到并發(fā)和事務(wù),一定要多留幾個(gè)心眼,考慮周全,確認(rèn)以下要點(diǎn)是否都正確實(shí)現(xiàn):lLA28資訊網(wǎng)——每日最新資訊28at.com

  • 是否做了必要的并發(fā)控制?
  • 事務(wù)的傳播行為是否符合預(yù)期?
  • AOP 的執(zhí)行順序是否符合預(yù)期?
  • 對(duì)并發(fā)的場(chǎng)景是否做了充分的測(cè)試?
  • 對(duì)于比較關(guān)鍵的操作,是否打印了必要的日志?

本文鏈接:http://www.www897cc.com/showinfo-26-11218-0.html后端|一個(gè)分布式鎖「失效」的案例分析

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 【Django入門】第一個(gè)Django項(xiàng)目

下一篇: 玩轉(zhuǎn)Python屬性和方法,成為高手不再難!

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 5月iOS設(shè)備性能榜:M1 M2依舊是榜單前五

    和上個(gè)月一樣,沒有新品發(fā)布的iOS設(shè)備性能榜的上榜設(shè)備并沒有什么更替,僅僅只有跑分變化而產(chǎn)生的排名變動(dòng),剛剛開始的蘋果WWDC2023,推出的產(chǎn)品也依舊是新款Mac Pro、新款Mac Stu
  • K6:面向開發(fā)人員的現(xiàn)代負(fù)載測(cè)試工具

    K6 是一個(gè)開源負(fù)載測(cè)試工具,可以輕松編寫、運(yùn)行和分析性能測(cè)試。它建立在 Go 和 JavaScript 之上,它被設(shè)計(jì)為功能強(qiáng)大、可擴(kuò)展且易于使用。k6 可用于測(cè)試各種應(yīng)用程序,包括 Web
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對(duì)Reader和Writer接口的組合,
  • 谷歌KDD'23工作:如何提升推薦系統(tǒng)Ranking模型訓(xùn)練穩(wěn)定性

    谷歌在KDD 2023發(fā)表了一篇工作,探索了推薦系統(tǒng)ranking模型的訓(xùn)練穩(wěn)定性問題,分析了造成訓(xùn)練穩(wěn)定性存在問題的潛在原因,以及現(xiàn)有的一些提升模型穩(wěn)定性方法的不足,并提出了一種新
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個(gè)月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當(dāng)時(shí)用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 共享單車的故事講到哪了?

    來源丨海克財(cái)經(jīng)與共享充電寶相差不多,共享單車已很久沒有被國(guó)內(nèi)熱點(diǎn)新聞關(guān)照到了。除了一再漲價(jià)和用戶直呼用不起了。近日多家媒體再發(fā)報(bào)道稱,成都、天津、鄭州等地多個(gè)共享單
  • 三星推出Galaxy Tab S9系列平板電腦以及Galaxy Watch6系列智能手表

    2023年7月26日,三星電子正式發(fā)布了Galaxy Z Flip5與Galaxy Z Fold5。除此之外,Galaxy Tab S9系列平板電腦以及三星Galaxy Watch6系列智能手表也同期
  • 英特爾Xe-HP項(xiàng)目終止,將專注Xe-HPC/HPG系列顯卡

    據(jù)10 月 31 日消息報(bào)道,英特爾高級(jí)副總裁兼加速計(jì)算系統(tǒng)和圖形事業(yè)部總經(jīng)理 表示,Xe-HP“ Arctic Sound” 系列服務(wù)器 GPU 已經(jīng)應(yīng)用于 oneAPI devcloud 云服
  • DRAM存儲(chǔ)器10月價(jià)格下跌,NAND閃存本月價(jià)格與上月持平

    10月30日,據(jù)韓國(guó)媒體消息,自今年年初以來一直在上漲的 DRAM 存儲(chǔ)器的交易價(jià)格僅在本月就下跌了近 10%,此次是全年首次降價(jià),而NAND 閃存本月價(jià)格與上月持平。市
Top 主站蜘蛛池模板: 绍兴县| 萝北县| 龙江县| 许昌市| 隆尧县| 阳信县| 宜宾县| 清水县| 永修县| 济阳县| 屯门区| 太仓市| 永胜县| 靖江市| 揭西县| 镇赉县| 华安县| 开阳县| 乌鲁木齐县| 红安县| 修文县| 孟津县| 祁阳县| 大庆市| 吉林市| 衢州市| 南投县| 仪征市| 柳江县| 扎兰屯市| 栾城县| 峡江县| 富蕴县| 南乐县| 临沧市| 名山县| 正阳县| 云南省| 邹平县| 濉溪县| 姜堰市|