您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

接口性能优化的 15 个技巧

时间:2022-10-18 14:16:41  来源:今日头条  作者:马士兵教育

原创:微观技术

作为后端研发同学为了几两碎银,没日没夜周旋于各种人、各种事上。

如果你要想成长的更快,就要学会归纳总结,找到规律,并且善用这些规律。

就比如工作,虽然事情很多、也很繁琐,但如果按照性质归下类,我觉得可以分为两大类:

1、业务类,如:产品要做一个红包活动,下周一就要上线,于是研发同学就吭哧吭哧,周末加班不睡觉也要赶出来

2、技术类,如:架构升级、系统优化等,这类事情对技术能力有一定要求,通常要求有一定的项目经验的同学来 owner

关于业务类的内容很大程度依赖于产品同学的节奏,研发更多是被动角色,我们能做的是就是多跟产品聊天,「实时」了解产品的最新动向,培养自己的业务 sense,给自己多预留一定的buffer时间可以去做技术调研、技术储备。

工作过一段时间同学一般都经历过,产品变化节奏很快,经常都是倒排时间,让研发苦不堪言。

至于技术类,相对就比较温和的多了,不过也非常考验研发的技术实力。

今天,我们就来聊下关于接口性能优化有哪些技巧?

1、本地缓存

本地缓存,最大的优点是应用和cache是在同一个进程内部,请求缓存非常快速,没有过多的网络开销等,在单应用不需要集群支持或者集群情况下各节点无需互相通知的场景下使用本地缓存较合适。缺点也是因为缓存跟应用程序耦合,多个应用程序无法直接的共享缓存,各应用或集群的各节点都需要维护自己的单独缓存,对内存是一种浪费。

常用的本地缓存框架有 Guava、Caffeine 等,都是些单独的jar包 ,直接导入到工程里即可使用。

我们可以根据自己的需要灵活选择想要哪个框架

 

使用门槛比较低, 大家可以自行网上搜索相应的教程,这里就不展开了。

本地缓存适用两种场景:

  • 对缓存内容时效性要求不高,能接受一定的延迟,可以设置较短过期时间,被动失效更新保持数据的新鲜度
  • 缓存的内容不会改变。比如:订单号与uid的映射关系,一旦创建就不会发生改变

注意问题:

  • 内存 Cache 数据条目上限控制,避免内存占用过多导致应用瘫痪。
  • 内存中的数据移出策略
  • 虽然实现简单,但潜在的坑比较多,最好选择一些成熟的开源框架

2、分布式缓存

本地缓存的使用很容易让你的应用服务器带上“状态”,而且容易受内存大小的限制。

分布式缓存借助分布式的概念,集群化部署,独立运维,容量无上限,虽然会有网络传输的损耗,但这1~2ms的延迟相比其更多优势完成可以忽略。

优秀的分布式缓存系统有大家所熟知的 Memcached 、redis。对比关系型数据库和缓存存储,其在读和写性能上的差距可谓天壤之别,redis单节点已经可以做到 8W+ QPS。设计方案时尽量把读写压力从数据库转移到缓存上,有效保护脆弱的关系型数据库。

注意问题:

  • 缓存的命中率,如果太低无法起到抗压的作用,压力还是压到了下游的存储层
  • 缓存的空间大小,这个要根据具体业务场景来评估,防止空间不足,导致一些热点数据被置换出去
  • 缓存数据的一致性
  • 缓存的快速扩容问题
  • 缓存的接口平均RT,最大RT,最小RT
  • 缓存的QPS
  • 网络出口流量
  • 客户端连接数

3、并行化

梳理业务流程,画出时序图,分清楚哪些是串行?哪些是并行?充分利用多核 CPU 的并行化处理能力

如下图所示,存在上下文依赖的采用串行处理,否则采用并行处理。

 

JDK 的 CompletableFuture 提供了非常丰富的API,大约有50种 处理串行、并行、组合以及处理错误的方法,可以满足我们的场景需求。

之前写的文章:搞定 CompletableFuture,并发异步编程和编写串行程序还有什么区别?

4、异步化

一个接口的 RT 响应时间是由内部业务逻辑的复杂度决定的,执行的流程约简单,那接口的耗费时间就越少。

所以,普遍做法就是将接口内部的非核心逻辑剥离出来,异步化来执行。

下图是一个电商的创建订单接口,创建订单记录并插入数据库是我们的核心诉求,至于后续的用户通知,如:给用户发个短信等,如果失败,并不影响主流程的完成。

我们会将这些操作从主流程中剥离出来。

 

业务的普遍做法就是,下单成功后,发送一条异步消息到MQ 服务器,由消费端监听 topic,异步消费执行,通过发布/订阅 模式也能支持一些新的消费任务的快速接入。

5、池化技术

TCP 三次握手非常耗费性能,所以我们引入了 Keep-Alive 长连接,避免频繁的创建、销毁连接。

池化技术也是类似道理,将很多能重复使用的对象缓存起来,放到一个池子里,用的时候去申请一个实例对象 ,用完后再放回池子里。

池化技术的核心是资源的“预分配”和“循环使用”,常见的池化技术的使用有:线程池、内存池、数据库连接池、HttpClient 连接池等

连接池的几个重要参数:最小连接数、空闲连接数、最大连接数

 

比如创建一个线程池:

new ThreadPoolExecutor(3, 15, 5, TimeUnit.MINUTES,
new ArrayBlockingQueue<>(10),
new ThreadFactoryBuilder().setNameFormat("data-thread-%d").build(),
(r, executor) -> {
if (r instanceof BaseRunnable) {
((BaseRunnable) r).rejectedExecute();
}
});

6、分库分表

MySQL的底层 innodb 存储引擎采用 B+ 树结构,三层结构支持千万级的数据存储。

当然,现在互联网的用户基数非常大,这么大的用户量,单表通常很难支撑业务需求,将一个大表水平拆分成多张结构一样的物理表,可以极大缓解存储、访问压力。

 

分库分表也可能会带入很多问题:

  • 分库分表后,数据在分表内产生数据倾斜
  • 如何创建全局性的唯一主键id
  • 数据如何路由到哪一个分片

每一个问题展开都要花费很长篇幅来讲解,这里主要讲接口性能优化的方案汇总,就不展开细讲了。

关于分库分表,市场受欢迎的开源框架是 sharding-jdbc,目前已经捐赠给Apache并启动孵化

之前写的文章:为什么要分库分表?

7、SQL 优化

虽然有了分库分表,从存储维度可以减少很大压力,但「富不过三代」,我们还是要学会精打细算,就比如所有的数据库操作都是通过 SQL 来执行。

一个不好的SQL会对接口性能产生很大影响。

比如:

  • 搞了个深度翻页,每次数据库引擎都要预查非常多的数据
  • 索引缺失,走了全表扫描
  • 一条 SQL 一次查询 几万条数据

SQL 优化的经验非常多,比如:

  • SQL 查询时,尽量不要使用 select * ,而是 select 具体字段
  • 如果只有一条查询结果(或者最大值、最小值),建议使用 limit 1
  • 索引不宜太多,一般控制在 5个以内
  • where 语句中尽量避免使用 or来连接条件。or 可能会导致索引失效,从而全表扫描
  • 索引尽量避免建在有大量重复数据的字段上,如:性别
  • where 、 order by 涉及的列上建索引,避免全表扫描
  • 更多.....

SQL 优化的内容非常多,这里就不展开了

之前写的一篇文章:SQL 优化有哪些技巧?

8、预先计算

有很多业务的计算逻辑比较复杂,比如页面要展示一个网站的 PV、微信的拼手气红包等

如果在用户访问接口的瞬间触发计算逻辑,而这些逻辑计算的耗时通常比较长,很难满足用户的实时性要求。

一般我们都是提前计算,然后将算好的数据预热到缓存中,接口访问时,只需要读缓存即可

是不是一下子就快了很多。

 

9、事务相关

很多业务逻辑有事务要求,针对多个表的写操作要保证事务特性。

但事务本身又特别耗费性能,为了能尽快结束,不长时间占用数据库连接资源,我们一般要减少事务的范围。

将很多查询逻辑放到事务外部处理。

另外在事务内部,一般不要进行远程的 RPC 接口访问,一般占用的时间比较长。

 

10、海量数据处理

如果数据过大,除了采用关系型数据库的分库分表外,我们还可以采用 NoSQL

如:MongoDB、Hbase、Elasticsearch、TiDB

NoSQL 采用分区架构,对数据海量存储能较好的支持,但是事务方面可能没那么友好。

每一个 NoSQL 框架都有自己的特色,有支持 搜索的、有列式存储、有文档存储,大家可以根据自己的业务场景选择合适的框架。

11、批量读写

当下的计算机CPU处理速度还是很多的,而 IO 一般是个瓶颈,如:磁盘IO、网络IO。

有这么一个场景,查询 100 个人的账户余额?

有两个设计方案:

方案一:开单次查询接口,调用方内部循环调用 100 次

方案二:服务提供方开一个批量查询接口,调用方只需查询 1 次

你觉得那种方案更好?

答案不言而喻,肯定是方案二

数据库的写操作也是一样道理,为了提高性能,我们一般都是采用批量更新。

12、锁的粒度

并发业务,为了防止数据的并发更新对数据的正确性产生干扰,我们通常是采用 加锁 ,涉及独享资源每次只能是一个线程来处理。

问题点在于,锁是成对出现的,有加锁就是释放锁

对于非竞争资源,我们没有必要圈在锁内部,会严重影响系统的并发能力。

控制锁的范围是我们要考虑的重点。

之前写过一篇常用的锁有哪些,聊聊 13 种锁的实现方式

13、上下文传递

Tom哥带团队对小伙伴有要求,代码必须要有 code review 环节,review 同学代码经常发现一个问题。

当需要一个数据时,如果没有调 RPC 接口去查,比如想用户信息这种通用型接口

因为前面要用,肯定已经查过。但是我们知道方法的调用都是以栈帧的形式来传递,随着一个方法执行完毕而出栈,方法内部的局部变量也就被回收了。

后面如果又要用到这个信息,只能重新去查。

如果能定义一个Context 上下文对象,将一些中间信息存储并传递下来,会大大减轻后面流程的再次查询压力。

14、空间大小

如何创建一个集合,这还不简单,很快我们就写出下面代码

List<String> lists = Lists.newArrayList();

如果说,要往里面插入 1000000 个元素,有没有更好的方式?

我们做个试验:

场景一:

 

结果:1000000 次插入 List,花费时间:154

场景二:

 

结果:1000000 次插入 List,花费时间:134

如果我们预先知道集合要存储多少元素,初始化集合时尽量指定大小,尤其是容量较大的集合。

ArrayList 初始大小是 10,超过阈值会按 1.5 倍大小扩容,涉及老集合到新集合的数据拷贝,浪费性能。

15、查询优化

避免一次从 DB 中查询大量的数据到内存中,可能会导致内存不足,建议采用分批、分页查询



Tags:接口   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
一篇文章带你了解Python的分布式进程接口
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。一、前言在Thread和Process中,应当优...【详细内容】
2024-04-11  Search: 接口  点击:(2)  评论:(0)  加入收藏
走进光纤世界:揭秘光纤接口的四大类型
光纤技术作为现代通信的基石,已经广泛应用于各种数据传输场景中。它以高速率、长传输距离、抗干扰性强、低衰减以及带宽占用小等优点,成为了数据通信领域中的重要物理层连接方...【详细内容】
2024-04-10  Search: 接口  点击:(1)  评论:(0)  加入收藏
马斯克脑机接口再造奇迹:瘫痪小伙意念玩赛车击败正常人
马斯克脑机接口公司的首位志愿者,又给我们展现了一段“绝活”:  肩部以下全无知觉的他,只靠脑中的一块芯片,就打起了马里奥赛车游戏。  只见赛车前进、转弯,控制得相当灵活。...【详细内容】
2024-03-26  Search: 接口  点击:(24)  评论:(0)  加入收藏
中国移动董事长杨杰谈脑机接口:假若真能实现,将真正实现人的永生
每经记者:杨卉 每经编辑:梁枭今日(3月21日)晚间,中国移动(SH600941,股价102.68元,市值2.2万亿元)披露了2023年业绩数据。公司营业收入突破万亿元大关,其中通信服务收入8635亿元,同比增...【详细内容】
2024-03-22  Search: 接口  点击:(12)  评论:(0)  加入收藏
瘫痪8年小哥植入马斯克脑机接口,狂打8小时「文明6」!Neuralink首个人类植入者直播来了
一名因潜水事故导致肩部以下瘫痪八年的 29 岁男子,正在借助脑机接口设备重温在线国际象棋和杀时间大作游戏《文明 6》。这是脑机接口公司 Neuralink 最新一场直播的内容,迅速...【详细内容】
2024-03-21  Search: 接口  点击:(24)  评论:(0)  加入收藏
脑机接口将为人类带来什么
◎实习记者 蒋 捷 实习生 杨茜茹怎样才能突破身体的限制,用意识与万物相连?在《西游记》中,孙悟空拥有凭借意念隔空取物的超能力。如今,脑机接口技术可以建立大脑与外部设备的直...【详细内容】
2024-02-29  Search: 接口  点击:(29)  评论:(0)  加入收藏
马斯克:首位脑机接口受试者可通过意念控制鼠标
当地时间周一(19日)晚上的一次活动中,马斯克透露了旗下的脑机接口公司Neuralink首位人类受试者的最新进展。他表示,该受试者已经完全康复,并可以通过大脑控制电脑鼠标。在社交媒...【详细内容】
2024-02-21  Search: 接口  点击:(34)  评论:(0)  加入收藏
如何防止被恶意刷接口?
前言在面试时,经常会被问一个问题:如何防止别人恶意刷接口?这是一个非常有意思的问题,防范措施挺多的。今天这篇文章专门跟大家一起聊聊,希望对你会有所帮助。图片1 防火墙防火墙...【详细内容】
2024-02-19  Search: 接口  点击:(38)  评论:(0)  加入收藏
芯片植入人脑待长期评估,马斯克脑机接口终极目标:人与AI共生
&middot;伦敦国王学院植入式医疗设备教授认为,Neuralink在与参与者一起训练系统前,要给参与者时间恢复。真正的成功需要长期评估脑机接口的稳定性和对参与者的好处。&middot;...【详细内容】
2024-02-01  Search: 接口  点击:(86)  评论:(0)  加入收藏
双头Type-C接口:解析充电方向的奥秘
随着科技的飞速发展,电子设备之间的连接与充电方式也在不断地革新。其中,Type-C接口以其高效、便捷的特性,逐渐成为了主流。特别是双头Type-C线,更是为用户带来了前所未有的便利...【详细内容】
2024-01-02  Search: 接口  点击:(153)  评论:(0)  加入收藏
▌简易百科推荐
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(2)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(7)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
站内最新
站内热门
站内头条