一个update语句执行要10s,大厂的架构真垃圾!

Win10系统常见问题_尝试检索虚拟交换机列表时出错,软件测试开发中常见的一些问题面试专题 回车, 按Y键确认,然后会返回如上图所示的许多“目录不是空的”提示,不用管它,其实大部分文件已经删除,等运行完再次输入“rd X:\Windows.old /s”命令,回车,按Y键确认,瞬间Windows.old文件夹已经灰飞烟灭了。XP系统,然后插入Windows10 安装光盘(或用虚拟光驱加载Win10 ISO镜像),Win + R 快捷键调出“运行”对话框,输入“cmd”,确定,打开命令提示符窗口,输入并按回车键运行以下命令:。系统会扫描系统中的一些占用磁盘空间的垃圾文件,并返回一个扫描结果窗口。 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:juejin.cn/post/

7132454233638436901

5f73a2d4952cd03ec26171c3604f61b5.jpeg


一、问题描述

2022年7月2x日,窗外夕阳将落不落,余晖洒落在街道上,远处的热浪仿佛在说:嘿,欢迎来到烤箱中的瑞士卷—成都!

“嘿!”,我回过神来看到一只洁白纤细的手落在我的肩膀上,眼光从窗外收回顺着手臂快速扭跟过去,然后看到脸色暗淡夹杂着些许痘痘的测试妹纸一脸的严肃!“昨天晚上上线后,这个后台执行更新信息非常缓慢,这里肯定有问题!”

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

二、问题分析

“好的,我排查一下”。三步并作两步回到工位,掀开MacBook Pro的盖子、打开显示器的电源、输入链路日志跟踪系统地址、复制traceId、查看日志…… 这一套操作熟悉得令人心疼。

排查日志初步发现实际调用了两次,第一次执行时间接近10s,调用超时,第二次执行时间接近5s。你肯定也想到了,RPC调用retry设置了值。对RPC配置检查之后确实设置的是retry=1,实际项目中,增、删、改等操作不应设置retry。

通过调用链排查发现update执行非常耗时。聪明的你一定也第一时间怀疑update语句有性能问题。把update语句拿出来:

update table set a=#{1},b=#{2},... where id =#{0} (id主键)

这下傻眼了,根据主键id更新怎么可能要执行10s?

masaga?!!

为了验证我的猜想,command + 空格、键入idea并回车、打开对应的工程、定位到对应的方法处、迅速浏览一遍并思索片刻之后,真相大白!

9e9973d7e1db0cea193813cdd16618b6.jpeg

服务B执行完update语句之后,事务commit之前,还有两个异步通知任务,使用的是spring的@Async注解,自定义的线程池,跟踪日志中的线程标志,排查过程中发现有的异步任务居然由原线程执行!进一步分析日志发现这种现象并不是一直发生,有时又是由异步线程执行。开始排查线程池,线程池果然设置了callRunner的失败策略。

所以,由原线程执行时,事务的范围如下:

4be1c1ccfe2f6a8626268031d36aeb44.jpeg

定位到原因之后,修改线程池参数为常见策略,初始和最大线程数相同,队列数9999,保证线程池的线程充足性。

修复

灰度

招呼测试妹纸测试

自信满满,悠闲喝水

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

三、梅开二度

“在高并发场景下,复现了这个问题,你快看一下”!测试妹纸对我投来鄙视的眼光犀利的说道:“修复好了,再喊我回归哈,拜拜~”。

奇怪,为什么这么平常的一个update语句,怎么会执行这么长时间呢?难道出发了框架的bug导致事务提交延迟?不对不对,这个方向想偏了~也没有其他地方在更新这个表了呀?不可能有表锁,更不可能有行锁呀……

masaga?!!

根据表锁以及行锁的思路,为了验证我的内心OS猜想,立即使用 show processlist 进行了连接查询,果然有重大发现,除了服务B有连接之外,还有服务A的连接。而服务A又是服务B的上游系统!系统架构如下:

5913e256900594cc173e4bcf7457db8b.jpeg

执行顺序如下:

顺序服务执行动作关键点
1服务A执行update语句数据库 行锁 lock
2服务A调用服务BRPC 调用
3服务B执行update语句数据库 行锁 waiting
4服务A调用服务B超时RPC timeout
5服务A再次调用服务BRPC retry
6服务A调用调用服务B再次超时RPC timeout
7服务APRC调用超时异常数据库 事务回滚 行锁 unlock
8服务B执行数据库 行锁 竞争

不被人信任的滋味很难受!为了重新赢回测试妹纸对我的信任,这次的bug修复只需成功不许失败!

四、解决方案

知道病根之后,问题就很简单了。

最理想的方案

对微服务架构进行重构,但这样做带来的收益不高,现在手上还有优先级更高的事情要做。

2d1b02ab2f0036fd9fb983f942e33158.jpeg
最实际的方案

是将服务A对服务B的调用和服务A的事务分离出来。这样就不存在锁竞争的问题了。

8bc2b61f323fb05eced9340f8431a622.jpeg

五、总结

看到了这里,你心里是不是已经在想:我靠,大厂的系统架构真的很垃圾,我都是关着灯的~(走错片场~)

其实这个系统变成这样是有历史原因的,如果当初的开发者能够采用DDD的思想或者能够明白微服务的对象高内聚思想,或许今天就不会发生在我身上这场研发与测试之间的信任危机。

夕阳落下,夜晚笼罩着大地。路旁的小猫咪悠然站了起来,张大嘴巴打个哈欠的同时伸了个懒腰,然后走向3号门口,等待着心地善良的加班儿投食猫粮。“验证通过,早点下班”。不远处传来测试妹纸的声音,夹杂着中央空调吹出的风声。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

238fc38e44df99870f9e46c9a83fbecb.png

已在知识星球更新源码解析如下:

f4e0bb05ae7203d2553da626f74fd148.jpeg

cde63b89bf0125d1d3c7ca23da253a7b.jpeg

7915df473257780b71a9cbe724ab03e8.jpeg

4c61e02d594f2595c213bf2ba8cd54cb.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
Python实战:用朴素贝叶斯构建高鲁棒性短信垃圾信息过滤器 垃圾短信检测是典型的二分类任务,其核心在于将非结构化短文本转化为可判别特征,并在低误伤、低漏判约束下实现稳定决策。原理上依赖文本表征(如TF-IDF)、概率建模(如朴素贝叶斯)与业务敏感的特征工程协同;技术价值体现在轻量、可解释、抗数据漂移,显著优于黑盒深度模型在资源受限场景的性价比;典型应用于通信App消息过滤、客服系统前置拦截、社区私信风控等实时安全场景。本文基于NLTK与scikit-learn,聚焦真实噪声处理、长度特征建模、emoji/URL语义化清洗及min_df参数调优等关键实践,提供可直接部 阅读详情

相关推荐

大厂Python自动化测试面试题合集

题目:函数的作用是什么?调用函数的语法?答案:将独立功能代码封装成模块,复用代码;函数名(实参)。题目:函数 return 作用是什么?无 return 时函数返回什么?多返回值底层是什么类型?答案:返回函数执行结果;无 return 默认返回 None;return x,y,z 底层自动封装为元组。题目:函数四大参数类型分别是什么?定义顺序要求?答案:必选参数、默认参数、可变位置 * args、命名关键字、可变关键字 **kwargs;顺序:必选→默认→*args→命名关键字→**kwargs。

悦分享 104

(2)SpringBoot学习——芋道源码

内容来自芋道源码(https://www.iocoder.cn/Spring-Boot/autoconfigure/?self)

猫脸码客的博客 2939

基于芋道源码的rocketmq源码版本再次对核心功能实现进行详细的注解标识,一款低延迟、可靠、可扩展、易用的面向消息的中间件

Apache RocketMQ 是阿里巴巴海量消息业务诞生的一款低延迟、可靠、可扩展、易用的面向消息的中间件。Pub/Sub 和 P2P 消息传递模型,在同一队列中实现可靠的 FIFO 和严格的顺序消息传递,长拉队列模型,也支持推流消费风格,单队列百万消息累积能力,通过各种消息传递协议,如JMS,MQTT等。,分布式高可用部署架构,满足至少一次消息投递语义,用于隔离测试和云隔离群集的 Docker 映像,功能丰富的管理仪表板,用于配置、指标和监控

你见过最垃圾的代码长什么样?(来长长见识)

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 10:33更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~...

芋艿V 1054

Windows10下RTABMAP+T265实现三维建图

win10+rtabmap+t265扫描地形

Suxiang1997的博客 3486

利用Matlab绘制非线性系统相图:从理论到实践

本文详细介绍了如何利用Matlab进行非线性系统的相图绘制与相平面分析。从理论基础的状态空间转换出发,通过无阻尼线性谐振子和范德波尔振荡器等实例,手把手演示了使用ode45求解器绘制相图、分析平衡点与极限环的完整流程,并分享了方向场绘制、参数分岔探索及常见错误解决方案等高级技巧,为动力学系统分析与控制设计提供了直观强大的可视化工具。

yhn456789的博客 905

国外程序员吐槽:永不再为 Oracle 工作了 !

(给技术最前线加星标,每天看技术热点)转自:开源中国社区近日,某网友在Hacker News 上发起了一个 “你见过的最糟糕的代码是什么?” 的问题,引起了广泛关注和讨...

redditnote的博客 1116

《第二十二篇》Cross-Attention:注意力机制详解-代码实现和公式详解《二》

本文详细介绍了Cross-Attention的原理、公式和实现。Cross-Attention用于Transformer解码器和Encoder-Decoder结构,通过查询向量(Q)与键、值向量(K、V)的交互实现序列对齐。核心公式为softmax(QK^T/√d_k)V,其中Q来自Decoder,K、V来自Encoder。文章还给出了多头注意力机制公式和PyTorch实现代码,包括投影计算、注意力分数计算和输出处理。代码示例展示了如何构建一个完整的Cross-Attention模块,并演示了其在解码器查询

guoguozgw的博客 2209

接手前同事代码,特别烂,各种BUG,看麻了。。。

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 10:33更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 E...

芋艿V 755

易灵思FPGA-软件Efinity和Modelsim联仿设置

文章目录前言一、modelsim破解过程二、使用步骤1.引入库2.读入数据总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智

qq_35221855的博客 5362

ESP32+MAX7219二进制时钟设计与嵌入式时间映射实践

二进制时钟是嵌入式系统中数据表示与物理呈现深度耦合的典型范例,其核心在于将时间语义(年月日时分秒)解构为比特位,并通过LED点阵的空间权重布局实现直观识别。该设计依托RTC模块提供时间基准,依赖SPI协议完成微控制器与专用驱动芯片(如MAX7219)的可靠通信,涉及寄存器级配置、位图坐标变换、软硬件时序对齐等关键原理。技术价值体现在低资源占用下的高可读性人机交互,适用于教学演示、极客项目及嵌入式UI原型开发。本文聚焦ESP32平台在MicroPython环境下,结合MAX7219驱动8×8点阵实现高可靠性二

weixin_42160645的博客 301

离谱了!一个update语句执行要10s,大厂的架构真的是垃圾!

看到了这里,你心里是不是已经在想:我靠,大厂的系统架构真的很垃圾,我都是关着灯的~(走错片场~)其实这个系统变成这样是有历史原因的,如果当初的开发者能够采用DDD的思想或者能够明白微服务的对象高内聚思想,或许今天就不会发生在我身上这场研发与测试之间的信任危机。夕阳落下,夜晚笼罩着大地。路旁的小猫咪悠然站了起来,张大嘴巴打个哈欠的同时伸了个懒腰,然后走向3号门口,等待着心地善良的加班儿投食猫粮。“验证通过,早点下班”。不远处传来测试妹纸的声音,夹杂着中央空调吹出的风声。

z1ztai的博客 901

学习利用ce修改游戏生命参数

易语言代码 游戏的简陋界面 用ce查找存储这个1000即生命值的内存地址(得先附加到目标程序上,点击左上角那个电脑按钮) 看到有很多值为1000的,但哪个是生命值呢?真相只有一个 我们点击一下打我这个按钮,看下面的ce界面上地址为004A65C0处的值变了,所以这个就是我们要找的生命值 接下来我们对生命值进行修改,修改为99

zsd747289639的博客 5万+

一个update语句执行要10s,大厂的架构真的是垃圾!

大家好,我是老赵前言近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。问题描述2022年7月2x日,窗外夕阳将落不落,余晖洒落在街道上,远处的热浪仿佛在说:嘿,欢迎来到烤箱中的瑞士卷—成都!“嘿!”,我回过神来看到一只洁白纤细的手落在我的肩膀上,眼光从窗外收回顺着手臂快速扭跟过去,然后看到脸色暗淡夹杂着些许痘痘的测试妹纸一脸的严肃...

公众号-老炮说Java 227

【GlobalMapper精品教程】074:从Lidar点云创建3D地形模型

本文基于地形点云数据,基于泊松方法、贪婪三角形测量方法和阿尔法形状创建3d地形模型。

智慧空间实验室 2167

AI游戏制作07——波次计时器,敌人按波次生成

AI游戏制作07——波次计时器,敌人按波次生成

qq_40572023的博客 47

Java大厂面试核心考点与系统设计实战指南

Java技术面试是开发者职业发展的重要关卡,尤其在大厂招聘中更注重工程化思维和系统设计能力。从JVM内存模型到并发编程原理,技术深度决定面试成败。本文以阿里P7、腾讯T9级考核标准为参考,详解ArrayList扩容机制、HashMap树化改造等高频考点,并深入分析G1 GC调优、AQS实现等底层原理。在分布式系统设计方面,涵盖秒杀架构、分库分表等实战场景,帮助开发者掌握用量化指标论证技术选型的能力。针对Java开发者关注的性能优化和工程实践问题,提供从源码分析到线上故障排查的完整方法论。

weixin_30326741的博客 279

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

想涨工资,工作两年如何跳槽到大厂?月薪直涨10K

不管是校招还是社招都避免不了各种⾯试、笔试。如何去准备这些东⻄就显得格外重要,之前4月底阿里的人事部门打电话叫我要不要面试,当时正处于换工作的期间,于是就把简历发给京东hr,人事审核后经过一些列面试、机试,最终顺利拿到了offer,出于未来职业规划的考量,本人手里还有其他的一些offer,还没有定下来,顺便在此分享一下我面试京东的一些经验以及面试题总结的分享!(以上为网友视角阐述)

Chenhui98的博客 257

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java大厂面试7天突击指南:JVM、MySQL、Redis核心考点解析

Java虚拟机(JVM)作为Java生态的核心运行时环境,其内存模型与垃圾回收机制直接影响应用性能。理解堆内存分区、GC算法等原理,能帮助开发者进行有效的性能调优。在数据库领域,MySQL的索引优化与事务隔离级别是保证数据一致性与查询效率的关键技术。Redis作为高性能缓存解决方案,其持久化策略与热key处理方案对高并发场景至关重要。这些核心技术在大厂面试中常以实际问题形式出现,比如JVM内存泄漏排查、MySQL索引失效优化等场景题。掌握JVM参数调优、EXPLAIN执行计划分析、Redis布隆过滤器等实战

weixin_30906185的博客 455

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【Redis】2026 互联网大厂 Redis 面试高频题

**Redis 面试高频题解析: 1. Redis为什么快? 内存操作:数据存储在内存,访问速度比磁盘快千倍。 单线程模型:避免多线程锁竞争和上下文切换,核心命令高效执行。 I/O多路复用:基于epoll实现高并发连接管理,单线程处理万级连接。 高效数据结构:如SDS字符串、跳表等,优化操作复杂度。 2. 单线程如何利用多核CPU? 多线程I/O(Redis 6.0+):网络收发包和协议解析由多线程处理。 多实例部署:绑定不同CPU核心,分散负载。 集群分片:通过Redis Cluster将数据分散到多节点

时光、疏离了记忆づ童话的博客 4029

Unity大厂面试必备:C++基础与引擎底层原理深度解析

C++作为系统级编程语言,其核心价值在于对内存、并发和性能的精细控制。理解内存管理(堆栈分配、智能指针)和多线程同步(原子操作、互斥锁)等原理,是构建高性能、稳定应用的技术基石。在游戏开发领域,这些底层能力直接关联到引擎优化、资源管理和实时渲染等关键场景。对于Unity开发者而言,掌握C++基础不仅能深化对IL2CPP编译、Job System并发的理解,更是应对大厂技术面试、进行Native插件开发和ECS架构优化的关键。本文聚焦Unity面试高频考点,通过内存管理、多线程等热词切入,系统拆解C++知识如

weixin_30417487的博客 404

大厂Java面试核心:JVM、并发与分布式系统设计

Java技术面试的核心在于考察候选人对底层原理和分布式系统设计的理解能力。JVM内存模型与GC调优是性能优化的基础,涉及对象内存布局、垃圾回收器选型等关键概念。并发编程则需要掌握Java内存模型和happens-before原则,避免常见的线程安全问题。分布式系统设计中,CAP理论和一致性协议(如TCC)的工程实践尤为重要,需根据业务场景权衡一致性与性能。消息队列(如Kafka)的高级用法能有效解决顺序消费和事务消息等复杂场景。这些技术不仅是大厂面试的考察重点,更是构建高并发、高可用系统的必备技能。

weixin_33806300的博客 363

大厂Java面试:Spring Boot、JVM、Redis、Kafka、微服务与电商场景实战——谢飞机的搞笑翻车现场

下一个,谢飞机?”面试官王工低头扫了一眼简历,又抬眼看了看面前这个头发略翘、背着双肩包的年轻人。“到!面试官好,我叫谢飞机,谢是谢飞机的谢,飞机是谢飞机的飞机。”谢飞机紧张地鞠了一躬,差点把电脑包甩出去。王工面无表情地按了下录音笔:“坐吧。我们开始。

2602_95996092的博客 218
上一篇: 7000字+24张图带你彻底弄懂线程池
下一篇: 我在项目里用雪花算法搞了唯一ID生成,结果上线就引发了故障...
公众号-芋道源码
博客等级 码龄10年 1627粉丝 377原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值