首页 > 其他分享 >API 接口性能优化管理

API 接口性能优化管理

时间:2024-08-16 15:23:07浏览次数:14  
标签:缓存 数据 性能 接口 API 优化

前言

国内项目普遍出现工期紧、工作量大、多人协作开发编码习惯不同,能力也参差不齐等多种因素,导致接口在上线后性能不满足预期。

本文从接口性能需求分析、接口性能准出标准、接口性能常见问题以及性能优化策略等多个方面,系统地完成接口性能优化的工作。

同时在项目交付过程中,可以通过 Code Review 、 技术债务等方式提前进行一部分接口性能的识别和优化,因为越复杂的项目拖到最后调整的代价越大。

接口性能需求分析流程

图片

分析要点:

  1. 列举系统中核心场景,梳理出 API 接口清单,询问外部系统是否支持压测,防止将其它系统压崩

  2. 结合系统用户数、请求量、现有数据量以及未来几年的增长量,确定接口的性能指标,比如:TPS 等

  3. 准备预生产环境,进行 API 接口的压测

  4. 统计接口的 TPS、响应时间、CPU 占有率、内存占有率、接口错误率等数据指标

  5. 筛选不达标的接口,通过 APM 应用性能工具和调用链路查看耗时情况

  6. 根据具体情况进行 API 接口优化

接口性能的准出标准

以一个中等复杂软件系统为样例的接口性能准出标准:

图片

接口性能优化方案

图片

接口性能常见问题

代码结构不合理
  1. 循环调用数据库或者外部系统,导致耗时长

  2. 查询复杂单据详情时,不考虑实际情况,一股脑的把所有关联的数据查询出来

  3. 一次性加载巨量数据到内存中进行处理,耗时长或者 OOM 内存溢出

  4. 接口返回大量数据,接口处理时间长,网络传输时间长,前端页面处理数据时间长

  5. 执行数据库保存时,经常使用默认的 saveAll,导致一条条插入到数据,耗时长

  6. 大量非必要、不阻塞主流程的业务逻辑写在一起导致长事务、数据一致性等问题

  7. 不阻塞主流程或着可延迟处理的外部系统调用,都使用同步调用的方式

SQL 编写不合理
  1. SQL 执行语句没有新建对应的索引

  2. SQL 执行语句包含隐式类型转换、最左匹配失效、使用函数或表达式等导致慢 SQL

  3. SQL join 了超过了三张及以上表

  4. 小表连大表,left join 无索引,导致全量扫描大表情况

  5. 深分页问题

  6. order by 走文件排序

  7. group by 使用了临时表

  8. 海量数据时count很慢,因 MySQL InnoDB count会遍历所有数据,计数准确但是性能较低

其他
  1. 请求高频、数据变更频率低,比如:基础数据、权限数据等,高并发下延迟大,可考虑使用缓存

  2. MySQL 数据库并发顶不住的时候,比如:点赞等,可考虑使用 Redis 等先缓存扛着后同步到 MySQL

  3. ......

性能优化策略

1️⃣ 配置优化

  • JVM 参数

  • 数据库连接池参数

  • 硬件参数

2️⃣ 代码优化

  • 减少外部资源重复调用

  • 按需查询所关联的数据资源

  • 批量操作数据库

3️⃣ 池化技术

  • 使用线程池处理业务逻辑

  • 使用对象池复用已有对象

  • HTTP 连接池访问外部系统

4️⃣ 数据库优化

  • 使用索引 、 现有索引优化

  • SQL 编写不合理,避免太多表 Join、临时表、全表扫描

  • 避免大事务,减少死锁

  • 锁力度避免过粗,减少锁占用超时

  • 深分页问题:1)通过ID记录标签 2)先深分页查询id,再inner join

5️⃣ 异步思想

  • 耗时操作,考虑异步执行

  • 同步远程调用由同步改为异步

  • 非阻塞主流程业务改为异步

6️⃣ 缓存策略

  • Nginx 缓存

  • Redis 缓存 / 分布式缓存

  • 本地缓存

  • 注意数据一致性、缓存穿透、缓存击穿、大 Key 等问题

7️⃣ 大数据量处理

  • 接口返回的数据量过大:分层分级返回、分批次返回、分页返回、压缩数据、延迟加载等

  • 大量数据加载到内存,导致 OOM,可考虑分批次处理

  • 海量数据时,count 查询慢,建议和分页列表接口分离

  • 千万级别数据,可考虑冷热数据分离、数据库表分区、分库分表等

  • 海量数据处理,考虑使用 NoSQL

8️⃣ 可观测性 & 工具

  • 日志平台

  • 分布式追踪

  • APM & 告警平台:CPU、内存监控

  • 数据库:Explain语句(MySQL)

  • 性能诊断工具:Jstack 查看进程信息

小结

API 接口优化是一个持续的过程,需要根据实际的业务需求和系统负载不断进行调整和优化。通过以上方法,可以显著提高API的性能、可用性和用户体验。

标签:缓存,数据,性能,接口,API,优化
From: https://blog.csdn.net/WBKJ_Noah_/article/details/141260063

相关文章

  • 产品经理必备知识——API接口
    前言在古代,我们的传输信息的方式有很多,比如写信、飞鸽传书,以及在战争中使用的烽烟,才有了著名的烽火戏诸侯,但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如今万物互联的时代,我通过一部手机就可以实现衣食住行的方方面面,比如:在家购物、远程控制家电、自动驾驶......
  • API协议设计的10种技术
    在这个数字时代,我们的日常生活中充斥着各种应用程序和系统之间的交互。无论是社交媒体、在线购物还是智能家居设备,它们都需要通过API(应用程序接口)来实现数据的传输和通信。然而,这些看似简单的操作背后隐藏着复杂的协议。API协议包含了一组规则和标准,用于定义不同系统之间如何......
  • 接口测试的常用协议
    接口测试的常用协议Http协议(超文本传输协议):HTTP是用于在网络上传输数据的常用协议。绝大多数的API都是基于HTTP协议的,使用HTTP方法(如GET、POST、PUT、DELETE等)进行通信。HTTPS(HypertextTransferProtocolSecure):HTTPS是HTTP的安全版本,通过使用SSL(SecureSocketsLayer......
  • JAVA面向对象|(一)Java接口 Interface
    目录一、概述(一)概念(二)特点(三)接口VS类二、使用 (一)类实现接口(二)接口间的多继承 演示(三)标记接口 1.标记接口 定义2.标记接口 作用3.标记接口 应用参考文章:Java接口_w3cschool一、概述(一)概念        Java接口是一种抽象类型,是一系列方法的声明......
  • Java 8 Stream API: 深入理解与高效使用
    Java8StreamAPI:深入理解与高效使用大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Java8引入的StreamAPI为集合操作提供了一种声明式的处理方式,它不仅可以使代码更加简洁易读,还能提高性能。本文将深入探讨StreamAPI的内部机制,并展示如何高效......
  • C++图像识别、图像识别接口、ocr api
    如果您在找工作并且在找内容审核编辑的工作,那么不难发现,快手在全国多个招聘网站发布了关于“内容审核编辑”岗位的招聘信息,据悉,此次的“内容审核编辑”岗位招聘的规模达3000人。因为快手上面“低龄妈妈”内容的炒作,所以被要求整改,才有后续的大规模招聘内容审核编辑人员的现象......
  • 导购APP的技术架构与用户体验优化
    导购APP的技术架构与用户体验优化大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿!随着移动互联网的快速发展,导购APP已成为连接用户与商品的桥梁。本文将探讨导购APP的技术架构设计以及如何通过技术手段优化用户体验。技术架构概览导......
  • vue-router,vue3介绍,vue3快速创建项目,常用api,生命周期,setup的特殊写法
    Ⅰvue-router【一】路由守卫#1路由守卫是什么 是否登录,登录后才能访问,没登录重定向到login作用:对路由进行权限控制#2全局守卫、独享守卫、组件内守卫使用importElementfrom'element-ui'//全局路由守卫-->前置路由守卫router.beforeEach((to,fr......
  • 接口隔离原则
    在介绍接口隔离原则之前我们先看下面举例说明中的第一个例子——反例一、举例说明1.反例(1)类图说明因为类图比较清晰,我们先看类图可以看出,DogPlays.java和CatPlays.java分别实现了接口PetInterface,DogPlaysUse和CatPlaysUse又分别通过该接口依赖DogPlays和Ca......
  • nuxt2 优化asyncData 里多个接口await串行请求的弊端,改为并行请求
    优化前多个接口await串行请求,若一个接口用时1秒,3个接口一共得用时3秒才行asyncasyncData(){letres1=awaitdanielService.getAllDanielByIndex();letres2=awaitjournalService.getJournalType();letparams={page:1,pagesize:10,......