文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何解决写接口出现的问题

2024-04-02 19:55

关注

这篇文章主要介绍“如何解决写接口出现的问题”,在日常操作中,相信很多人在如何解决写接口出现的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决写接口出现的问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

深夜,领导:“你写的接口有问题!赶紧起床瞧瞧”。Ding!催命软件一响,你就知道,该 Work 了......

可思来想去,觉得不可能啊。我的代码,就是一个简单的 Redis 查询啊,难不成是 Redis 挂了?

同事把证据全部发到了群里,是你的接口无疑。一个简单的 Get 查询,平均耗时达到了 2 秒。jstack,promethus  的监控,把问题全部指向到了你的接口!

登录 Redis 服务器,一切正常。该怎么办?要这么不明不白不清不楚的背个章丘大铁锅么?

如何解决写接口出现的问题

快是原罪

这种情况下,要相信自己的直觉。你的接口又快又好,很可能是木秀于林,鹤立鸡群,当了替罪鸟。

在 “某些” "高并发"环境下,由于资源未做隔离,在发生问题的时候,一些日志和工具的表现,会有非常强的迷惑性。

发生问题的,都是速度最快、请求最多的接口,但理论上并不可能。

如何解决写接口出现的问题

如上图。这种情况很常见。大多数请求,通过 Tomcat 线程池的调度,进行真正的业务处理。

当然线程池是不干这种脏活的,它把请求交给资源处理池去处理,比如:

如何解决写接口出现的问题

我们平常的编码中,通常都会共用这样的资源池。因为它写起代码来简单,不需要动脑。

但如果你的服务本身,并没有做好拆分以及隔离,问题就是致命的。比如,你把报表接口和高并发的 C 端接口放在了一个实例上。

这时候,你就有可能被报表接口给坑了。

一个例子

我们以数据库连接池为例,来说明一下这个过程,先看一下以下基础信息:

速度快的 B 接口,请求量是远远大于接口 A 的,平常情况下相安无事。

有一天,接口 A 忽然有了大量的查询,由于它的耗时比较长,迅速把数据库的 50 个连接池给占满了(接口 B 由于响应快,持有时间短,慢慢连接会被 A  吃掉)。

这时候,无论是接口 A,还是接口 B 的请求,都需要等待至少 5 秒钟,才能获取下一条数据库连接,业务才能正常走下去。

不一小会儿,服务的状态就变成这样:

一般在遇到这种问题的时候,我们都倾向于使用 jstack 打印信息堆栈,或者查看一些内部的监控曲线。

可惜的是,这些信息,大部分都是骗人的,你看到的慢查询,并不是真正的慢查询。

如何解决写接口出现的问题

从上面的分析中,你应该很容易看出问题的症结所在:未隔离的瓶颈资源引起上游资源的连锁反应。

但在平常的工作中,我不止一次看到有同学对此手忙脚乱。很多证据都指向了一些又快又好的接口,而这些根本和它们一点关系都没有。他们乐呵呵的截图,@相关人等,嚣张至极。

在遇到这种情况的时候,你可以使用下面的脚本进行初步分析:

$ cat 10271.tdump| grep "waiting to lock " | awk '{print $5}' | sort | uniq -c | sort -k1 -r  26 <0x0000000782e1b590>   18 <0x0000000787b00448>   16 <0x0000000787b38128>   10 <0x0000000787b14558>

上面的例子,我们找到给 0x0000000782e1b590 上锁的执行栈,可以发现全部是卡在 HttpClient 的读操作上了。

在实际场景中,可以看下排行比较靠前的几个锁地址,找一下共性:

如何解决写接口出现的问题

而这些显示信息非常少的堆栈,才是问题的根本原因。

如何解决

增加 Tomcat 连接池的大小,或者增加连接池的大小,并不能解决问题,大概率还会复现。

最好的解决方式,当然是把耗时的服务和正常的服务拆分开来,比如时下流行的微服务。你的服务查询慢,自己访问超时,和我的服务,一丁点儿关系都没有。

但是,你的服务即然能遇到这种问题,就证明你的公司缺乏这种改造的条件。就只能在单体服务上来做文章。

这种做法,就是隔离:

如何解决写接口出现的问题

如上图,我们在同一个工程里,创建了两个 MySQL 数据库连接池,指向了相同的 MySQL 地址。

使用这种方式,连接池的操作,就能够相对做到互不影响。但到现在为止,还没完,因为你的 Tomcat 连接池依然是共享的。

慢查询相关的,从连接池中获取连接的策略,要改一下,不能一直等待,而应该采用 FailFast  的方式(获取连接短时间的超时也是可以的),否则症状还是一样。

时下流行的熔断概念,也在一定程度上实践这种隔离性。

到此,关于“如何解决写接口出现的问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯