查询ecshop网站代码排查方法_一次线上接口超时的排查过程

news/2024/5/20 13:54:34/文章来源:https://blog.csdn.net/weixin_39808893/article/details/111123418

1、事件还原

昨天下午,收到一个504的告警,显然这是一个超时告警。当时由于手头有其他事情,没在意,就只是瞄了一眼,但是引起告警的方法很熟悉,是我写的,第一反应有点诧异。

诧异之后,继续处理手头的工作。

一小时过后,又收到同样的告警,显然不是偶尔,肯定是哪儿出问题了,于是开始排查。

报警的接口是一个Controller层ControllerA的getControllerAMethod接口,其调用了多个微服务,并最终拼装结果数据进行返回。出问题的是ServiceM,ServiceM服务里的getServiceMMethod方法逻辑也很简单,主要是两次数据库查询,从MySQL数据库取到数据并返回给调用方。

调用链如下图所示

a17490771c3c83b54af41166315f0e84.png

2、环境介绍

语言:Go

DB:MySQL

数据库交互:database/sql(公司在此基础上做了一些定制和封装,本质还是database/sql)

下面开始介绍这个问题的具体排查过程。

3、本能反应:从sql语句入手

拿到告警,从告警信息和对应的日志详情信息来看,属于超时问题。

第一反应是查看sql语句是否是慢查询(虽然打心里知道这个可能性极低),sql语句很简单,形如

select a, b, c from tableA where a in (a1,a2,a3)

不看执行计划也知道是可以命中索引的。

但还是看了下执行计划和真实的执行情况,分析结果和响应时间都相当可观,没有任何问题。

本能反应的排查就是这么索然无味,开始下一步排查。

4、上游排查:是否context时间耗尽

既然是超时问题,有可能是上游超时,也可能是下游超时,第一步排查已经排除了下游因为慢查询导致超时的可能性。

那会不会是上游超时呢?显然是有可能的,毕竟我们知道Go的context可以一路传递下去,所有服务调用都共用设置的总的时间额度。

而且从上图可以发现ServiceM也是在上游接口的最后一步,所以如果上面的服务占用耗时过多,就会导致ServiceM的时间额度被压缩的所剩无几。

但是从日志排查可以发现,在ServiceM层看getServiceMethod方法对应sql查询几乎都是几十毫秒返回。

从这个情况来看,不像是因为上游时间不够导致的超时。

5、下游初步排查:rows成主要怀疑对象

既然上游时间额度充足,那问题还是大概率出在下游服务接口上。

于是开始仔细阅读getServiceMMethod方法代码,下面是代码功能的伪代码实现

rows, err = db.query(sql1)if err != nil { ...}defer rows.Close()for rows.Next() { rows.scan(...)}rows, err = db.query(sql2)if err != nil { ...}defer rows.Close()for rows.Next() { rows.scan(...)}

看完代码,开始有点小兴奋,我想没错了,大概就是这个rows的问题了。

在《Go组件学习——database/sql数据库连接池你用对了吗》这篇我主要介绍了有关rows没有正常关闭带来的坑。所以开始联想是否是因为在遍历rows过程中没有正确关闭数据库连接,造成连接泄露,以至于后面的查询拿不到连接导致超时。

原因我已经分析的清清楚楚,但是具体是哪一步除了问题呢,唯一能想到的是这里两次查询使用的是同一个rows对象,是不是某种情况导致在前一次已经关闭了连接而下一次查询直接使用了关闭的连接而导致超时呢?

此时报警开始越来越频繁,于是将这里两次查询由原来的一个rows接收改为使用两个rows分别接收并关闭,然后提交代码,测试通过后开始上线。

6、短暂的风平浪静

代码上线后,效果立竿见影。

告警立马停止,日志也没有再出现超时的信息了,一切又恢复到了往日的平静,这让我坚信,我应该是找到原因并解决问题了吧。

回到家后,心里还是有些不踏实,从11点开始,我拿出电脑,开始各种模拟、验证和还原告警的原因。

7、三小时后,意识到风平浪静可能是假象

从11点开始,一直到两点,整整三个小时,我不但没有找到原因,反而发现我的解决方式可能并没有解决问题。

因为出问题的代码并不复杂,如上所示,即只有两个Select查询。

于是我写了一段一样的代码在本地测试,跑完后并没有出现超时或者拿不到连接的情况。甚至,我将maxConn和IdleConn都设置为1也无不会出现超时。

除非,像文章《Go组件学习——database/sql数据库连接池你用对了吗》里说的一样,在row.Next()过程中提前退出且没有rows.Close()语句,才会造成下一次查询拿不到连接的情况,即如下代码所示

func oneConnWithRowsNextWithError() {db, _ := db.Open("mysql

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_776055.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python学习网站_超全python资料合集

阅读文本大概需要 15 分钟。今天给大家推荐一些python相关的学习资料。在信息爆炸的时代,获取信息的渠道尤为重要。这篇可以称得上比较全的资料集了,希望对大家有所帮助。Python资料汇总(来源: Python学习交流)包括长期必备、入门教程、练手…

linux网站运行系统下载文件,linux系统中如何打开文本文件_网站服务器运行维护,linux,打开,文本文件...

linux终端显示中文乱码_网站服务器运行维护linux终端显示中文乱码的解决方法:1、首先执行【yum -y groupinstall chinese-suport】命令,安装中文语言包;2、编辑配置文件,添加【export LANG"zh_CN.UTF-8"】;3…

潮流设计!15个现代风格的单页扁平化网站设计

下面是15个现代风格的单页扁平化网站设计的例子。扁平化设计(Flat UI Web Design)和单页网站(Single Page Web Design)这两个概念可以算作是去年网页设计最热门的趋势。所以设计师结合这两个概念来进行网站设计并不奇怪。看看这些…

(转载)一步步构建大型网站架构

2019独角兽企业重金招聘Python工程师标准>>> 之前我简单向大家介绍了各个知名大型网站的架构,亿万用户网站MySpace的成功秘密、Flickr架构、YouTube网站架构、PlentyOfFish 网站架构学习、WikiPedia技术架构学习笔记。这几个都很典型,我们可以…

html底部添加备案号,网站底部怎么放备案号 WordPress、CMS、discuz等常见程序添加方法...

应工信部备案要求,现在很多站长不知道怎么添加备案号和跳转,导致网站备案被退回,甚至网站备案被注销,需要重新备案,下面给大家讲解一下,常见的程序怎么添加备案号和添加跳转网站上跳转代码一般都是使用html…

form提交后刷新网页_初识meta标签与SEO——零基础自学网页制作

初识meta标签属性如果您学习了《HTML页面中head标签有啥用?——零基础自学网页制作》这一篇教程,一定了解了utf-8这种编码方式的特性,下面我们通过一个练习来看看指定或不指定utf-8编码方式对页面显示的影响。练习一:测试不同浏览…

更新网站 图片缓存_自由职业者品牌建设之什么是百度快照,为何我的快照老不更新?...

网站搭建完毕,提交搜索引擎收录后,大家都会关心自己网站的百度快照,我想大家都会有这样的疑问:到底什么是快照?为什么我的快照不更新?我的快照为什么会倒退?到底权重对快照有没有影响&#xff1…

打开网站显示输入用户名和密码

打开网站显示要输入用户名和密码遇见以上情况 请俺下面的步骤操作第一:右击我的电脑 管理 给匿名用户重新设置密码 默认的匿名用户账户为IUSR_GOODVPS-ACFB048这个也根据不同的提供商的计算机名称 可以在iis里面看到匿名用户的账户第二:在iis的网站属性里…

qt 鼠标悬停显示菜单_wordpress网站结构:调整菜单的3种方式!

糟糕的网站结构可能会给试图浏览站点的人们带来混乱体验。成功的导航路径的关键在于不断回顾如何引导访问者访问网站上想要的内容。wordpress网站结构首先,转到WordPress仪表板,单击“外观”,然后单击“菜单”。这里有三种方法可以重新设计站…

堡垒之夜服务器在维护,堡垒之夜》因紧急维护服务器下线 国外某网站神回复...

《碉堡之夜》目前正在国外的火爆程度能够说是如日外天,而若是它由于维护更新而久停办事器,那么多量玩家将不得不觅到其他体例来打发时间。今天,《碉堡之夜》就由于告急维护而下线了,不少玩家都正在无聊的刷灭推特等官方通知上线。…

html在线美化网站

Html在线美化压缩/转js - 在线工具 地址:http://tool.lu/html/ 1、美化效果: 2、转化字符串拼接

web作业制作网站_大学生校园班级网页设计成品 学校网站作业模板下载 静态HTML校园班级网页制作 dreamweaver网页作业下载...

本期为大家展示STU网页设计原创校园班级类网页作品,作品可使用任意HTML软件编辑修改网页中的文字信息,图片可直接覆盖替换。原创校园班级网页作品专区链接:www.lilixing.com/html/xiaoyuan/原创作品记录去向,不重复!此…

手动删除myeclipse所有文件_提升网站速度:删除未使用的CSS和无效规则

我们经常在检测网站加载速度的过程中,遇到了以下问题:从样式表中删除无效规则,并延迟不用于首屏内容的CSS加载,以减少网络活动消耗的不必要字节。尽管看起来CSS文件的大小只有几KB甚至没有1 MB,但不要仅仅因为文件大小…

一些比较好的Python技术网站

2019独角兽企业重金招聘Python工程师标准>>> 1、 鲁塔弗的博客 2、Web 框架: CherryPy Genshi转载于:https://my.oschina.net/frankies/blog/504188

网站相关技术探究keepalive_timeout(转)

网站相关技术探究keepalive设多少: /proc/$PID/fd/$number0:标准输入 1:标准输出2:标准错误Test:[rootKTQT ~]# ll /proc/12857/fdtotal 0 lrwx------ 1 root root 64 Apr 4 17:49 0 -> /dev/nulllrwx------ 1 root root 64 Apr 4 17:49 1 -> /dev/nulllrwx…

网站架构演变

系统架构演化历程-初始阶段架构 <img data-rawheight"367" data-rawwidth"516" src"https://pic4.zhimg.com/13bd5a6612620fdf51c8987ab3eb1273_b.jpg" class"origin_image zh-lightbox-thumb" width"516" data-…

php 网站 seo,怎么设计网站有利于SEO

有利于SEO的网站设计方法:1、域名包含关键字;2、做好网站扁平化结构;3、建立合理的站点导航;4、在导航链接锚文本描述中部署核心关键词;5、提供相关文章链接。网站应该怎么设计才能在搜索引擎排名更好,有以…

html网站实现站内搜索功能_网站制作提升用户体验的六个细节

网站策划是一门学问,从分类的角度来谈,有文案策划、美工策划、运营策划、功能策划等,今天我们要谈的应该是和功能有关,网站建设策划与策划之间是密不可分的,只有互相配合好了,才能做出用户喜欢的网站&#…

web前端项目实例网站_web前端-蓝莓派项目(上)

对于一个web前端学习者来说一定要多做项目多动手,以下这个项目适合系统学过当然对于小白来说有一点难度,一定要仔细跟着我们做不要放弃。第一节 项目准备http://iwenwiki.com/api /blueberrypai/我们制作 蓝莓派 项目项目制作流程 项目资料查看项目文件大…

html 判断是否全屏_如何查看百度蜘蛛,是否抓取网站呢?

很多SEO从业人员在刚刚接触这个行业的时候,经常会问——百度蜘蛛是什么?我们可以理解为百度蜘蛛就是用来抓取网站链接的IP,我们经常会听到百度蜘蛛来的太频繁,服务器要被抓爆了,如果你无法识别百度蜘蛛,你怎…