广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何解决写接口出现的问题
  • 173
分享到

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

2024-04-02 19:04:59 173人浏览 泡泡鱼
摘要

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

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

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

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

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

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

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

快是原罪

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

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

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

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

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

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

  • 一个数据库连接池,执行耗时的统计操作和迅速的查询操作。

  • 一个 Redis 连接池,执行阻塞性的慢查询和简单的 GET SET。

  • 一个 Http 连接池(HTTPClient、OkHTTP 等),远程调用速度不等的资源。

  • ...

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

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

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

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

一个例子

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

  • Tomcat 的连接池,配置大小为 200 个。

  • Mysql 的连接池,配置大小为 50 个,算是比较大了。

  • 接口 A 需要调用耗时的查询,耗时为 5 秒。

  • 接口 B 速度非常快,查询数据库响应时间在 200ms 以下。

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

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

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

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

  • 数据库连接池 50 个连接,迅速占满,而且几乎全被慢查询占满。

  • Tomcat 连接池的 200 个连接,迅速被占满,其中大部分是速度快的接口 B,因为它的请求量大速度快。

  • 所有接口都 Block 在 Tomcat 的线程上。进而造成:哪怕是查询一个非数据库的请求,也要等待 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  的方式(获取连接短时间的超时也是可以的),否则症状还是一样。

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

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

--结束END--

本文标题: 如何解决写接口出现的问题

本文链接: https://www.lsjlt.com/news/84254.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决写接口出现的问题
    这篇文章主要介绍“如何解决写接口出现的问题”,在日常操作中,相信很多人在如何解决写接口出现的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决写接口出现的问题”的疑惑...
    99+
    2022-10-19
  • 如何解决编写代码时出现的Go问题
    这篇文章主要介绍“如何解决编写代码时出现的Go问题”,在日常操作中,相信很多人在如何解决编写代码时出现的Go问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决编写代码时出现的Go问题”的疑惑有所帮助!...
    99+
    2023-06-15
  • 连接服务器时出现问题如何解决
    连接服务器时出现问题可能是由于网络连接或者服务器上的相关设置不正确引起的。可以通过以下步骤来解决:1、重新连接网络确保网络连接正常,...
    99+
    2023-03-11
    连接服务器 服务器
  • 如何解决Angular2 + node接口调试的问题
    小编给大家分享一下如何解决Angular2 + node接口调试的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!事情的起因由...
    99+
    2022-10-19
  • vue项目打包之后接口出现错误的问题及解决
    目录错误信息关键代码打包前打包后解决方式设置环境变量总结错误信息 这是新建一个项目还原问题,node简单写了个数据返回 关键代码 const express = require('...
    99+
    2022-11-13
  • 如何解决navicat链接oracle时出现的各种问题
    这篇文章主要介绍如何解决navicat链接oracle时出现的各种问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. ORA-28040: 没有匹配的验证协议 方法:在...
    99+
    2022-10-18
  • windows hello出现问题如何解决
    这篇“windows hello出现问题如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“windows hello出现...
    99+
    2023-07-01
  • 解决@Autowired注入static接口的问题
    目录@Autowired注入static接口问题@Autowired自动注入普通service很方便但是如果注入static修饰的service则注入不了后来网上百度了一下,看到了一...
    99+
    2022-11-12
  • 如何解决CentOS MAKE中出现的问题
    如何解决CentOS MAKE中出现的问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在CentOS MAKE的使用中会出现很多的问题,这次,我就碰到了CentOS MA...
    99+
    2023-06-16
  • 解决AndroidStudio出现“Cannotresolvesymbol”的问题
    (一) Android Studio 无法识别同一个 package 里的其他类,将其显示为红色,但是 compile 没有问题。鼠标放上去后显示 “Cannot res...
    99+
    2023-03-13
    Android Studio Cannot resolve symbol Android Studio 报错
  • 解决出现secure_file_priv null的问题
    在mysql安装目录的my.ini文件中的[mysqld]添加secure_file_priv = ' ';然后以管理员身份运行cmd, 进入mysql/bin停止mysql服务ne...
    99+
    2022-11-12
  • 如何解决Vue.js导出Excel出现乱码的问题
    Vue.js是一款流行的前端 JavaScript 框架。在Vue.js开发中,使用二进制文件来导出Excel文件时,可能会遇到Excel乱码的问题。这篇文章将通过介绍二进制编码的概念和解决方案来帮助大家解决Vue.js导出Excel出现乱...
    99+
    2023-05-14
  • Navicat连接MySQL时出现的连接失败问题及解决
    目录一、安装mysql的注意事项二、Navicat连接mysql方法一方法二总结一、安装MySQL的注意事项 官网下载安装,选择zip包,解压后不用安装只用配置好环境变量Path并在解压后的文件夹里新建文本文档my.in...
    99+
    2023-05-12
    Navicat连接MySQL Navicat连接MySQL连接失败 Navicat连接MySQL失败
  • 如何解决eclipse配置Tomcat和Tomcat出现无效端口问题
    小编给大家分享一下如何解决eclipse配置Tomcat和Tomcat出现无效端口问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、eclipse配置Tomc...
    99+
    2023-06-22
  • win8.1怎么解决切换窗口出现卡顿的问题?
    win8.1切换窗口出现卡顿解决办法,现在win8.1由于软件更新补丁,有一些漏洞出现,有些电话在切换窗口界面的时候,会出现卡顿的情况,怎么样解决这个办法呢。看看下面的方法吧。 1、在电脑上面,点击进入设置...
    99+
    2022-06-04
    窗口
  • python连接clickhouse的端口问题及解决
    目录python连接clickhouse端口问题向clickhouse导数据报错python连接clickhouse端口问题 <!-- It is the name th...
    99+
    2022-11-11
  • 解决swagger2.9.2接口文档显示的问题
    swagger2.9.2接口文档显示 swagger版本:2.9.2 框架:springboot2.1.2 当没有使用 @ApiImplicitParam和response=Resp...
    99+
    2022-11-12
  • springbootswagger不显示接口的问题及解决
    目录springboot swagger不显示接口swagger不显示接口的可能性springboot swagger不显示接口 @Bean public Docket creat...
    99+
    2022-11-13
  • 如何解决RestTemplate的getForEntity调用接口乱码的问题
    本篇内容介绍了“如何解决RestTemplate的getForEntity调用接口乱码的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!R...
    99+
    2023-06-20
  • MySQL中CONCAT()函数拼接出现NULL问题如何解决
    本文小编为大家详细介绍“MySQL中CONCAT()函数拼接出现NULL问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL中CONCAT()函数拼接出现NULL问题如何解决”文章能帮助大家解决疑惑,下面跟...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作