【接口】接口超时原因分析

news2024/9/19 17:53:14

接口超时的原因:

一、网络抖动

有可能是你的网络出现抖动、网页请求API接口、接口返回数据给网页丢包了。

二、被带宽占满

用户量暴增,服务器网络带宽被占满。

服务器带宽:一定时间内传输数据的大小,如:1s传输10M的数据

用户请求量增多,1s传输了100M,导致1s内,有90M的数据延迟传输,导致接口超时。

如何增加服务器带宽?

以NIGNX为例:

修改nginx配置文件中图片访问的配置部分
对于正常小图的访问不限制,把正常图的大小限定为 100K 以内,超出时就进行限速,速度限定为最大 100k/s

location ~ .*\.(gif|jpg|jpeg|png|bmp)$
 {     
   expires 30d;
   limit_rate_after 100k;
   limit_rate 100k;
}

三、线程池满了

有时候为了性能考虑,可能会使用线程池异步查询数据,最后把查询结果进行汇总,然后返回。

public UserInfo getUserInfo(Long id) throws InterruptedException, ExecutionException {
    final UserInfo userInfo = new UserInfo();
    CompletableFuture userFuture = CompletableFuture.supplyAsync(() -> {
        getRemoteUserAndFill(id, userInfo);
        return Boolean.TRUE;
    }, executor);

    CompletableFuture bonusFuture = CompletableFuture.supplyAsync(() -> {
        getRemoteBonusAndFill(id, userInfo);
        return Boolean.TRUE;
    }, executor);

    CompletableFuture growthFuture = CompletableFuture.supplyAsync(() -> {
        getRemoteGrowthAndFill(id, userInfo);
        return Boolean.TRUE;
    }, executor);
    CompletableFuture.allOf(userFuture, bonusFuture, growthFuture).join();

    userFuture.get();
    bonusFuture.get();
    growthFuture.get();

    return userInfo;
}

executor,表示自定义的线程池,为了防止高并发场景下,出现线程过多的问题。

但如果用户请求太多,线程池中已有的线程处理不过来,线程池会把多余的请求,放到队列排队,等待空闲线程的去处理。

如果队列中排队的任务非常多,某次API请求一直在等待,没办法得到及时处理,就会出现接口超时问题。

如何解决?

1、是否核心线程数设置太小了?

  • corePoolSize=> 线程池里的核心线程数量
  • maximumPoolSize=> 线程池里允许有的最大线程数量

2、有多种业务场景共用了同一个线程池?

四、数据库死锁

你提供的API接口中通过某个id更新某条数据,此时,正好线上在手动执行一个批量更新数据的sql语句。

该sql语句在一个事务当中,并且刚好也在更新那条数据,可能会出现死锁的情况

五、传入参数太多

如果接口调用方,一次性传入几千个,甚至几万个id,批量查询分类,也可能会出现接口超时问题。

查询条件太多,有可能走全表扫描更快。所以这种情况下sql语句可能会丢失索引,让执行时间变慢,出现接口超时问题

因此我们在设计批量接口的时候,建议要限制传入的集合的大小,比如:500

六、API超时设置

monitor:
  rest-template:
    readTimeout: 10000
    connectTimeout: 10000
    connectionRequestTimeout: 1000
  http-request:
    socketTimeout: 10000
    connectTimeout: 10000
    connectionRequestTimeout: 10000

如何做不同业务场景超时时间不同?

七、一次性返回数据太多

我们有个job,每天定时调用第三方API查询接口,获取昨天更新的数据,然后更新到我们自己的数据库表中。

如何解决?

第三方这种根据日期查询增量数据的接口,建议做成分页查询的,不然后面没准哪一天,遇到批量更新的操作,就可能出现接口超时的问题。

八、死循环

普通死循环:

无限死循环: 

九、数据库没有走索引

如何解决?

必要时可以使用force index来强制查询sql走某个索引。

十、服务OOM

API所在的服务OOM了,挂了一段时间,导致所有接口都请求超时

如何解决?

Prometheus的服务内存监控中,查到了OOM问题。然后K8S集群有监控,它自动会将挂掉的服务节点kill掉,并且在容器中重新部署了一个新的服务节点,先不要对用户造成影响。

然后排查是什么OOM了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

剑指Offer 第1天

第 1 天 栈与队列(简单) 剑指 Offer 09. 用两个栈实现队列 class CQueue { public: CQueue() {} void appendTail(int value) { s1.push(value); } int deleteHead() { while(!s1.empty()) { …

【Git :分布式版本控制工具】

【Git :分布式版本控制工具】 了解 Git 基本概念 能够概述 Git 工作流程 能够使用 Git 常用命令 熟悉 Git 代码托管服务 能够使用 IDEA 操作 Git 一、 概述 1. 开发中的实际场景 备份代码还原协同开发追溯问题代码的编写人和编写时间 2. 版本控制器的方式 集中式…

【数据结构】6.6 图的应用

文章目录生成树及其构造生成树的特点无向图的生成树6.6.1 最小生成树最小生成树及其典型应用MST性质构造最小生成树1. Prim(普里姆)算法2. Kruskal(克鲁斯卡尔)算法两种算法比较6.6.2 最短路径最短路径问题1. Dijkstra(迪杰斯特拉)算法迪杰斯特拉算法步骤2. Floyd(弗洛伊德)算法…

从零搭建一个组件库(二)创建代码规范

文章目录前言集成eslint1.安装2.替换默认解析器3.创建.eslintrc.yml配置文件4.创建忽略文件.eslintignore集成 prettier1.安装2.创建配置文件.prettierrc集成# commitizen1.安装2.修改package.json3.测试className的BEM规范1.安装2.BEM概述3.创建hooks函数4.使用hooks函数5.封装…

Vuex里面四个map方法(mapState、mapGetters、mapActions、mapMutation)

本章节主要讲述Vuex里面的四个优化代码的map方法,mapState、mapGetters、mapActions、mapMutation 一、store文件夹下面index.js主要内容,包含state(用于存储数据)、getters(计算属性)、mutatiions(加工数据)、actions(相应组件动作、写逻辑) 二、四个ma…

多个盒子排列规则(视觉格式化模型) 多个盒子的排列 页面布局

目录常规流常规流布局块盒的排列规则常规流 盒模型:规定单个盒子的规则 视觉格式化模型(布局规则):页面中的多个盒子排列规则 视觉格式化模型,大体上将页面中盒子的排列分为三种方式: 常规流浮动定位 …

react源码:目录结构、调试源码

我的技术栈是React,最近在整理react的源码,react版本是18.1.0,之前版本,没有看过,就此略过。 源码目录 从github将源码下载后,先看看源码目录结构,如下图所示: fixtures:代码贡献者提供的测试react package:react源码的主要部分,包含了Schedule、reconcile等等 s…

RadSystems Studio 8.1.8 Crack

RadSystems Studio 是一个用于快速开发和交付自定义应用程序的环境,快速应用开发环境,更快生成完整应用。RadSystems为生成现代应用程序和 API 提供了无数的设计选项和组件。很少或没有编码。无需专门的编程知识。可通过减少冗余编码时间来促进应用程序开…

Centos7 安装SkyWalking

Centos7 安装SkyWalkingCentos7 安装SkyWalking1 基础介绍1.1 概念1.2 核心三部分1.3 架构图2 快速安装2.1 前提条件2.2 拉取镜像2.3 启动SkyWalking2.4 访问SkyWalking UI界面Centos7 安装SkyWalking 1 基础介绍 1.1 概念 SkyWalking是一个国产的开源框架,2015年…

计算机组成原理3个实验-logisim实现“七段数码管”、“有限状态机控制的8*8位乘法器”、“单周期MIPS CPU设计”。

目录 标题1.首先是七段数码管 标题二:有限状态机控制的8*8位乘法器 标题三:单周期MIPS CPU设计 标题1.首先是七段数码管 1看一下实验要求: 2.接下来就是详细设计: 1. 组合逻辑设计 由于7段数码管由7个发光的数码管构成&#x…

信息论复习—率失真理论

目录 失真的概念: 信息率与失真的关系: 信息率失真理论: 失真函数矩阵: 平均失真度定义为: 平均失真度与信道转移概率的关系: 率失真函数: 率失真函数的物理意义: 率失真函数…

05 |「链表」必刷题

前言 前言:刷链表面试高频题。 文章目录前言一. 基础回顾二. 高频考题1、例题例题1:LeetCode 206 反转链表1)题目链接2) 算法思路3)源码剖析4)时间复杂度例题2:LeetCode 92 反转链表II1&#xf…

C++编译之(3)-camke/CMakeLists.txt的编译使用教程

引言 上一节介绍了前面我们介绍了make/Makefile来对c项目进行编译,我们继续以该项目为例讲解; C编译之(1)-g单/多文件/库的编译 C编译之(2)-make及makefile编译过程 我们先看看上一节的实战的目录结构如下: - mutilFilesDemo- include // 头…

Docker入门与应用

Docker入门与应用1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结1.4.安装Docker2.Docker的…

“华为杯”研究生数学建模竞赛2005年-【华为杯】D题:仓库容量有限条件下的随机存贮管理(附获奖论文)

赛题描述 工厂生产需定期地定购各种原料,商家销售要成批地购进各种商品。无论是原料或商品,都有一个怎样存贮的问题。存得少了无法满足需求,影响利润;存得太多,存贮费用就高。因此说存贮管理是降低成本、提高经济效益的有效途径和方法。 问题2 以下是来自某个大型超市的…

全链路追踪 jaeger

Jaeger 概述 Jaeger 是 Uber 开发并开源的一款分布式追踪系统,兼容 OpenTracing API,适用于以下下场景: 分布式跟踪信息传递分布式事务监控问题分析服务依赖性分析性能优化 特性 高扩展性 Jaeger后端的设计没有单点故障,可以…

大数据 | 《Riffle:Optimized Shuffle Service for Large-Scale》论文阅读

1. 简介 1.1. 近期工作 研究工作鼓励运行大量小任务 小任务能提高并行性,减少端到端耗时工程经验反对运行过多的任务 过多的task在shuffle阶段会引入大量IO开销,根本原因在于map和reduce阶段之间的shuffle IO请求数量随着任务数量的增长呈现指数级的增…

emoji 符号大全,给各位程序员增加一些奇怪的知识点

这篇博客非常有意思,我将为大家整理和罗列一些好用的 emoji 表情站点。 文章目录EmojiXDcarpedm20emoji-cheat-sheetemojiterrafsymbols符号大全unicode.orgemojiallemojiguideemojipediaemoji696 编辑器emoji.inkEmoji Artemojifinderemoji 可以在许多社交媒体平台…

Redis 持久化-AOF

Redis 持久化-AOF 1.官方资料 在线文档 : https://redis.io/topics/persistence 2.AOF 是什么? 1、AOF(Append Only File) 2、以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记录下来(比 如 set/del 操作会记录, 读操作 get 不记录) 3、…

【大数据趋势】1月24日 美元关键位置上,应该不会一次破,纳指有概率反弹,人民币结汇行情结束在即。

确定市场形态 - 美元指数 关键位置大概率不会一次就破,有较强反弹 作为长期的关键位置101-103这个区域,没有可能一次性涨破,或者一次性跌破,所以大概率有一次反弹出现。作为趋势线(红色)来看&#xff0c…