吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一個update語句執(zhí)行要10s,大廠的架構真無語!

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-01-29 10:45 ? 次閱讀


一、問題描述

2022年7月2x日,窗外夕陽將落不落,余暉灑落在街道上,遠處的熱浪仿佛在說:嘿,歡迎來到烤箱中的瑞士卷—成都!

“嘿!”,我回過神來看到一只潔白纖細的手落在我的肩膀上,眼光從窗外收回順著手臂快速扭跟過去,然后看到臉色暗淡夾雜著些許痘痘的測試妹紙一臉的嚴肅!“昨天晚上上線后,這個后臺執(zhí)行更新信息非常緩慢,這里肯定有問題!”

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

二、問題分析

“好的,我排查一下”。三步并作兩步回到工位,掀開MacBook Pro的蓋子、打開顯示器的電源、輸入鏈路日志跟蹤系統(tǒng)地址、復制traceId、查看日志…… 這一套操作熟悉得令人心疼。

排查日志初步發(fā)現(xiàn)實際調用了兩次,第一次執(zhí)行時間接近10s,調用超時,第二次執(zhí)行時間接近5s。你肯定也想到了,RPC調用retry設置了值。對RPC配置檢查之后確實設置的是retry=1,實際項目中,增、刪、改等操作不應設置retry。

通過調用鏈排查發(fā)現(xiàn)update執(zhí)行非常耗時。聰明的你一定也第一時間懷疑update語句有性能問題。把update語句拿出來:

updatetableseta=#{1},b=#{2},...whereid=#{0}(id主鍵)

這下傻眼了,根據(jù)主鍵id更新怎么可能要執(zhí)行10s?

masaga?!!

為了驗證我的猜想,command + 空格、鍵入idea并回車、打開對應的工程、定位到對應的方法處、迅速瀏覽一遍并思索片刻之后,真相大白!

06f25d70-9f73-11ed-bfe3-dac502259ad0.jpg

服務B執(zhí)行完update語句之后,事務commit之前,還有兩個異步通知任務,使用的是spring的@Async注解,自定義的線程池,跟蹤日志中的線程標志,排查過程中發(fā)現(xiàn)有的異步任務居然由原線程執(zhí)行!進一步分析日志發(fā)現(xiàn)這種現(xiàn)象并不是一直發(fā)生,有時又是由異步線程執(zhí)行。開始排查線程池,線程池果然設置了callRunner的失敗策略。

所以,由原線程執(zhí)行時,事務的范圍如下:

06fe1174-9f73-11ed-bfe3-dac502259ad0.jpg

定位到原因之后,修改線程池參數(shù)為常見策略,初始和最大線程數(shù)相同,隊列數(shù)9999,保證線程池的線程充足性。

修復

灰度

招呼測試妹紙測試

自信滿滿,悠閑喝水

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

三、梅開二度

“在高并發(fā)場景下,復現(xiàn)了這個問題,你快看一下”!測試妹紙對我投來鄙視的眼光犀利的說道:“修復好了,再喊我回歸哈,拜拜~”。

奇怪,為什么這么平常的一個update語句,怎么會執(zhí)行這么長時間呢?難道出發(fā)了框架的bug導致事務提交延遲?不對不對,這個方向想偏了~也沒有其他地方在更新這個表了呀?不可能有表鎖,更不可能有行鎖呀……

masaga?!!

根據(jù)表鎖以及行鎖的思路,為了驗證我的內心OS猜想,立即使用 show processlist 進行了連接查詢,果然有重大發(fā)現(xiàn),除了服務B有連接之外,還有服務A的連接。而服務A又是服務B的上游系統(tǒng)!系統(tǒng)架構如下:

070c7a52-9f73-11ed-bfe3-dac502259ad0.jpg

執(zhí)行順序如下:

順序 服務 執(zhí)行動作 關鍵點
1 服務A 執(zhí)行update語句 數(shù)據(jù)庫 行鎖 lock
2 服務A 調用服務B RPC 調用
3 服務B 執(zhí)行update語句 數(shù)據(jù)庫 行鎖 waiting
4 服務A 調用服務B超時 RPC timeout
5 服務A 再次調用服務B RPC retry
6 服務A 調用調用服務B再次超時 RPC timeout
7 服務A PRC調用超時異常 數(shù)據(jù)庫 事務回滾 行鎖 unlock
8 服務B 執(zhí)行 數(shù)據(jù)庫 行鎖 競爭

不被人信任的滋味很難受!為了重新贏回測試妹紙對我的信任,這次的bug修復只需成功不許失敗!

四、解決方案

知道病根之后,問題就很簡單了。

最理想的方案

對微服務架構進行重構,但這樣做帶來的收益不高,現(xiàn)在手上還有優(yōu)先級更高的事情要做。

07185eda-9f73-11ed-bfe3-dac502259ad0.jpg
最實際的方案

是將服務A對服務B的調用和服務A的事務分離出來。這樣就不存在鎖競爭的問題了。

072741ca-9f73-11ed-bfe3-dac502259ad0.jpg

五、總結

看到了這里,你心里是不是已經(jīng)在想:我靠,大廠的系統(tǒng)架構真的很垃圾,我都是關著燈的~(走錯片場~)

其實這個系統(tǒng)變成這樣是有歷史原因的,如果當初的開發(fā)者能夠采用DDD的思想或者能夠明白微服務的對象高內聚思想,或許今天就不會發(fā)生在我身上這場研發(fā)與測試之間的信任危機。

夕陽落下,夜晚籠罩著大地。路旁的小貓咪悠然站了起來,張大嘴巴打個哈欠的同時伸了個懶腰,然后走向3號門口,等待著心地善良的加班兒投食貓糧。“驗證通過,早點下班”。不遠處傳來測試妹紙的聲音,夾雜著中央空調吹出的風聲。



審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • macbook
    +關注

    關注

    0

    文章

    497

    瀏覽量

    41749
  • 線程
    +關注

    關注

    0

    文章

    505

    瀏覽量

    19758
  • 系統(tǒng)架構

    關注

    1

    文章

    70

    瀏覽量

    23589

原文標題:一個update語句執(zhí)行要10s,大廠的架構真垃圾!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    ADC128S022的驅動架構參考 ti-adc128s052.c,如何做移位生成12bit結果呢?

    ADC128S022的驅動架構參考 ti-adc128s052.c, 具體如下圖所示。 上層讀取buf[1], buf[2]請問如何做移位生成12bit結果呢?
    發(fā)表于 12-16 06:32

    深入理解C語言:循環(huán)語句的應用與優(yōu)化技巧

    在程序設計中,我們常常需要重復執(zhí)行段代碼。為了提高效率和簡化代碼,循環(huán)語句應運而生。C語言作為門經(jīng)典的編程語言,提供了多種循環(huán)控制結構,幫助程序員高效地實現(xiàn)重復操作。掌握循環(huán)
    的頭像 發(fā)表于 12-07 01:11 ?251次閱讀
    深入理解C語言:循環(huán)<b class='flag-5'>語句</b>的應用與優(yōu)化技巧

    LM4890做了音頻功放電路,使用時發(fā)現(xiàn)4890不到10S鐘就非常燙接著就保護無聲了,是什么原因?

    實際使用時發(fā)現(xiàn)4890不到10S鐘就非常燙接著就保護無聲了。這可能是什么原因呢,難道是MSOP封裝的4890溫度上升得更快無法達到實際1W的輸出功率? 還有問題,開始我曾經(jīng)把反
    發(fā)表于 10-24 08:25

    PCM2706C電腦端播放音樂后,點擊暫停出現(xiàn)10s左右的微弱噪聲如何解決?

    請教TI工程師,我的系統(tǒng)架構為PCM2706C + I2S DAC解碼,到耳機輸出, 出現(xiàn)的問題是電腦端播放音樂后,點擊暫停出現(xiàn)10s左右的微弱噪聲, 用邏輯分析儀可捕捉到這10s
    發(fā)表于 10-17 07:50

    TAS5805MPWPR輸出15W 10s后,芯片過熱保護了是什么原因導致的?

    TAS5805MPWPR輸出15W 10s后,芯片過熱而保護了。輸出的喇叭是4歐,底下散熱焊盤接觸良好。
    發(fā)表于 10-15 07:38

    想設計10Hz~10MHz的峰值檢波電路,請問這個架構可以達到我頻率范圍的要求嗎?

    我想設計10Hz~10MHz的峰值檢波電路,請問這個架構可以達到我頻率范圍的要求嗎?如果可以,器件的選型應該是怎樣的,如果不可以,什
    發(fā)表于 09-19 06:44

    請問ESP32-ADF如何編譯指定ESP32S2?

    /player里的例子,因為我實現(xiàn)MP3播放 但是像SDK里適配的開發(fā)板 esp32_s2_kaluga_1_v1_2是否沒有I2S驅運。是不是我需自己重新適配
    發(fā)表于 06-28 06:06

    愛旗V200系列模組連接AEP平臺update的工作機制

    update。發(fā)送更新注冊包之后,如果服務器沒有響應設備會重傳4次,重傳時間間隔分別為:2s,4s,8s,16s,最后
    發(fā)表于 06-04 06:46

    3輸入正與非門SN5410 SN54LS10 SN54S10 SN7410 SN74LS10 SN74S10數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《三3輸入正與非門SN5410 SN54LS10 SN54S10 SN7410 SN74LS10 SN74S10數(shù)據(jù)表.
    發(fā)表于 05-08 10:40 ?0次下載
    三<b class='flag-5'>個</b>3輸入正與非門SN5410 SN54LS<b class='flag-5'>10</b> SN54<b class='flag-5'>S10</b> SN7410 SN74LS<b class='flag-5'>10</b> SN74<b class='flag-5'>S10</b>數(shù)據(jù)表

    STM8L執(zhí)行語句大概需要幾個時鐘周期?

    STM8L執(zhí)行語句大概需要幾個時鐘周期
    發(fā)表于 05-06 06:16

    stm32間隔10s以上的初次上電作不工作,第二次上電正常工作是為什么?

    # 問題描述 -arm只要間隔到10s的初次上電就不工作,第二次上電就正常了 -初次上電拉低reset后芯片正常 # 疑問 -是不是因為上電復位電路的緣故 -是不是供電問題 -大家有沒有遇到類似問題,懇求解答(心累~)
    發(fā)表于 04-07 07:30

    鴻蒙TypeScript入門學習第6天:【條件語句

    條件語句用于基于不同的條件來執(zhí)行不同的動作。 TypeScript 條件語句是通過條或多條語句
    的頭像 發(fā)表于 04-01 13:51 ?799次閱讀
    鴻蒙TypeScript入門學習第6天:【條件<b class='flag-5'>語句</b>】

    控制器間SPI通信片選使能后為什么段時間才收發(fā)數(shù)據(jù)?

    求助各位大佬,[抱拳]:兩控制器間SPI通信片選使能后為什么段時間才收發(fā)數(shù)據(jù)?收發(fā)完數(shù)據(jù)后為什么過段時間才拉高片選?如附圖示時間段1和時間段2,片選控制設置的是軟件模式,手動
    發(fā)表于 03-13 08:13

    assign語句和always語句的用法

    的用法和功能。 、Assign語句 Assign語句的定義和語法 Assign語句用于在HDL中連續(xù)賦值,它允許在設計中為信號或變量分配
    的頭像 發(fā)表于 02-22 16:24 ?2784次閱讀

    verilog中for循環(huán)是串行執(zhí)行還是并行執(zhí)行

    的for循環(huán)也是并行執(zhí)行的。 Verilog中的for循環(huán)可以用來實現(xiàn)重復的操作,例如在時鐘周期中對多個電路進行操作。在循環(huán)內部,多個語句可以同時
    的頭像 發(fā)表于 02-22 16:06 ?3142次閱讀
    大发888玩法技巧| 百家乐获胜秘决| 百家乐官网云顶| 缅甸百家乐官网博彩| 免费百家乐官网规则| 麟游县| 六安市| 做生意门朝山| CEO百家乐现金网| 百家乐桌游| MG百家乐大转轮| 德州百家乐21点桌| 大发888官方注册| 澳门金莎娱乐城| 百家乐官网模拟游戏下载| 网上百家乐官网导航| 百家乐官网智能投注系统| 博彩百家乐官网字谜总汇二丹东| 百家乐电脑上怎么赌| 百家乐国际娱乐场开户注册| 威尼斯人娱乐城怎么样lm0| 亚洲顶级赌场的微博| 偏关县| 赌场百家乐官网是如何玩| 百家乐官网不锈钢| 百家乐英皇娱乐场| 大发888中文版| 兴和县| 牌九百家乐官网的玩法技巧和规则 | 百家乐娱乐官网网| 全讯网wn888.com| 凤凰娱乐开户| 免费下百家乐官网赌博软件| 百家乐官网娱乐城博彩通博彩网 | 博彩老头| 百家乐官网游戏下载| 免费百家乐官网统计工具| 百家乐谋略| 博彩网址| 荷规则百家乐官网的玩法技巧和规则 | 云鼎百家乐作弊|