如何做好服务端接口性能优化?

你好,我是储诚益。今天我们来聊一聊服务端接口的性能优化问题。
用户体验(UserExperience,简称 UE/UX)是用户在使用产品过程中建立起来的一种纯主观感受。当下,我们活在一个快节奏的时代,系统的响应度会极大地影响到产品的用户体验。当系统响应慢的时候,用户会在心理上暴躁不安,进行投诉。
面对用户的投诉,业务和产品的同学要求我们在短时间内解决这个问题。同时每次面临的场景都不一样,而性能优化也不是能够经常接触到的任务,所以我们大多数伙伴不是特别擅长。在短时间顶着巨大压力,干一件我们不擅长的事会让我们很苦恼。
那有没有一种通用的方法让我们能够快速掌握性能优化方面的内容呢?有,接下来我给你分享一下后端接口性能优化的内容。

接口性能指标

在优化之前,我们首先要明确优化指标,服务端的接口一般有两个性能指标 QPS(Query Per Second)与 RT(Response Time)。QPS 是每秒查询的次数,用来表示系统的整体承载量。RT 是接口的平均响应时间,用来表示系统的响应度。
理想中的系统是 QPS 越大越好,RT 越小越好,但现实中 QPS 与 RT 是相互影响的。随着 QPS 的逐渐增大,RT 也是逐渐增大的。在 A 点的时候 QPS 急剧拉上,RT 整体表现非常好。随着 QPS 进一步增长,RT 也有缓慢的增长。当到达 C 点的时候,QPS 到达了顶点,RT 有明显的增长。当到达 D 点的时候,QPS 减小了,RT 反而急剧拉上。当到达 E 点的时候,其实本质上系统已经崩溃,无法提供服务了。
注:蓝线是QPS 黄线是RT
从图中我们可以得出 C 点是最佳平衡点,在这个点,QPS 与 RT 整体上获得了最大的收益。接口性能优化的指标是确保 RT 能够满足业务体验,QPS 能够支持用户访问。例如:接口能够支持 5 万 QPS ,RT<500ms。

接口性能优化流程

前面我们详细阐述了接口性能优化的目标,在明确了接口的性能指标后,我们需要有一个可行的优化流程。一个完整的接口性能优化的流程包含接口梳理、优化方案制定、代码修改、性能压测、结果分析五个环节。接口梳理能够帮我们搞清楚现状,优化方案是规划未来,代码修改是从现状到未来,而性能压测是用来验证方案的正确性,结果分析用来做持续方案优化。

接口梳理

接口梳理是性能优化的基础,也是容易被我们忽略的环节。遇到问题的时候,我们本能地想着怎么修改,而忽略了搞清楚现状才能更好地作出决策。既然接口梳理如此重要,如何能够快速做好接口梳理呢?核心采用链路追踪法与标记整理法。
首先采用链路追踪方法把接口访问的每个方法按照访问的顺序标记下来,并按序号表示访问的先后顺序。通过思维导图可以将整个接口调用的方法拓扑出来,拓扑的维度到数据访问的级别。
然后对数据访问的方法进行 SQL 与 Redis 标记,标记出访问的具体内容与访问次数。最终整理汇总成表格,通过表格我们就可以清晰地知道最终访问了多少次存储。整体的结果如图中所示:
通过链路追踪我们能够清晰地画出我们整个接口访问的方法链路。最终对数据访问层的方法做 SQL 或 Redis 访问标记,最终整理出具体存储访问的明细。

优化方案

通过接口梳理我们可以清晰地知道接口访问链路与数据存储层访问的次数,为我们制定优化方案扫清了路障。有后端开发经验的同学都知道,整个后端接口的性能损耗主要是链路调用与存储访问造成的。所以核心优化策略就是做减法,尽一切可能减少方法调用与存储访问的次数。

访问链路优化

在访问链路上,我们首先要思考接口调用的方法是否提供了一些用不到的功能。如果存在这种情况,大概率是代码复用带来的。那么就重新构建只有当前接口需要的新方法,避免中间调用复用方法带来的额外的性能损耗。其次我们要考虑调用的多个方法是否一定要同步调用,如果能异步调用,我们就尽可能通过消息队列的形式进行异步访问。这样就能减小同步访问带来的性能损耗。

存储访问优化

在存储访问上的优化,大多后端工程师都会采用正向思维,如果访问的是数据库就改成 Redis,如果是 Redis 就改成本地缓存,这种优化思路我们都能想到。其实在大量实践后,往往同一个接口会经历“数据库到 redis,redis 到本地缓存”多次折腾。今天我在这里给你提供新的思考维度——终局思维。优先思考能不能不访问,其次思考能不能改成本地缓存,最后才是改成 Redis。
终局思维是从尽量能减少性能损耗的角度去思考的,能够极大地提高性能优化的效果。

代码修改

代码修改,基本上按照优化方案进行调整就可以了,唯一需要提醒的是,我们修改的方法要反复确认是否被其他地方调用了,如果调用了我们需要进行单元测试。

性能压测

接口通过功能测试之后可以进行性能压测。进行性能压测的时候可以借助 arthas 命令和 trace 命令来观察接口实际执行的情况。

总结

好了,今天的分享就结束了,最后我来给你总结一下。今天这节课,我们先讲了业务迭代对接口性能的痛点,接着描述了后端工程师需要在很短时间内完成接口性能优化的压力。在接口优化之前,要确定接口性能的指标(是在多少 QPS 下保证 RT 小于多少毫秒)。
具体的接口性能优化包含接口梳理、设计方案制定、代码修改、性能压测等五个环境。今天我们重点讲述了接口梳理,设计方案制定两个最重要的环节。在接口梳理的时候采用链路追踪法能够让我们清晰了解接口整个调用过程,标记整理法能够让我们确定对数据库以及缓存的访问情况。
在优化方案的制定上,核心是减法:减少无效调用,减少同步调用,减少缓存访问,减少数据库访问等。今天讲到是我在多次大促中沉淀出来的心法,并在实际工作进行了深入实践,希望你学完后可以在实际工作中用起来。
好,我是储诚益,希望我的分享可以帮助到你,欢迎你在视频下方的留言区和我一起讨论,也欢迎你把这节课分享给需要的朋友。

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。