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

性能优化之接口优化

时间:2022-10-20 16:58:22  来源:微信公众号  作者:马啟超

本文从客户端的视角,分享客户端如何协同服务端进行接口时间的优化。

Compose是什么

接口性能优化对于客户端的同学来讲涉及可能不是很多,但是接口的性能对于客户端的体验影响是巨大的;请求失败、loading、无数据这几个关键词跟客户端的同学一提,想必接口优化的意义就不用多说了吧。

一个快速而又稳定的接口,对于客户端的用户体验来说是大有裨益的。本文从客户端的视角,分享客户端如何协同服务端进行接口时间的优化。

分析

▐简析

客户端的一次完整的接口请求主要包括:

 

  1. 业务发起请求
  2. 网络传输
  3. 服务端处理
  4. 数据响应后解析
  5. 图层布局与渲染
  6.  

 

那么我们来看一下通常客户端发起一次接口请求,耗时都发生在哪些阶段:


 

 

  1. Prepare:主要包括请求前的参数拼装以及发送请求处理的线程切换;
  2. .NETwork Request:主要包括,鉴权、网络传输、服务端处理、Network SDK的数据处理等。
  3. Data Parse:业务上的数据解析,如json解析等的操作,以及线程间的切换等耗时。
  4. UI Refresh:主要是视图布局,渲染的操作。
  5. First Item Render:第一张卡片的渲染时间。

 

从上面数据上来看,客户端的耗时主要是:

 

  1. 请求前的参数绑定过程
  2. 请求后数据解析
  3. 数据上屏的图层布局以及渲染
  4. 异步请求过程中的线程不断切换造成切换耗时

 

客户端上这些操作往往在整个链路上占比较小,且过程优化空间较小;

然而大头往往在这两个方面:网络传输和服务端处理

方案

▐降低ServerRT(服务端处理耗时)

通常降低服务端处理耗时,是由服务端小伙伴来优化,当然优化过程中需要端上一起协助完成,大致了解一下服务端耗时的几种处理方案;

主要有这几种方式:

 

  1. 接口加缓存:合理设计临时缓存、持久缓存可以提高接口性能
  2. 内部接口并发请求:通常一个复杂的接口需要调用下游几个业务的接口,如果合理的进行并发请求,将会收到很好的效果
  3. 异步化:如写日志,更新缓存等不会影响接口准确性的非核心流程,可以采用异步方式进行处理,不阻塞主计算逻辑处理
  4. 数据批量处理:接口存在较大量计算,可以通过批量分批次(分而治之)方式来解决大量数据计算耗时问题
  5. sql加索引:数据库SQL是最常见的性能瓶颈,如SQL子查询、不合理索引设计、全表扫描、大量数据返回、大SQL等,通过监控平台查看慢查询SQL可立即找出影响接口性能瓶颈关键点

 

▐降低网络传输时间

虽然现有阶段大多数用户网络已经很不错了,但是还是有很多场景下,网络耗时占比还是非常高,尤其长尾数据中,网络耗时往往是最大的占比,所以网络耗时的优化依然是非常重要;当然端上的小伙伴在这个阶段可参与的空间也更多。

主要有哪些方式呢?

 

  • 接口多段返回

 

通常一个接口承载了较多的内容的话,其内容就会无限的进行膨胀,如果将埋点,日志,反馈等非主线的数据进行多段返回的话将会有很大的收益,此方案主要结合接口组成进行分析;当然,此方案改动量也比较大,成本也比较高。

 

  • 更换协议

 

大多数我们接口使用的是TCP协议,相比来说如果更换UDP协议,接口返回速度会快不少,详细原因可以翻一下资料学习一下,这里不再多说。

目前也已经有成熟的方案,比如阿里的XQUIC,有感兴趣的可以了解一下,具体的收益我这里也还在测试中。

 

  • 缩小网络包

 

为何缩小网络包会降低网络传输时间呢?

客户端和服务端网络通信时数据传输过程如下图所示:


 

数据包越大,则在光纤传输时所需的时间就会越久,因此接收方等待数据包的时间也会更长,最终会导致应用层等待数据时间变长。

还有,由于TCP采用的滑动窗口机制来提升传输性能,窗口的大小受接收端处理速率和网络拥塞情况影响,因此如果传输的包越小,则可以在尽量少的窗口周期完成数据的传输,减少响应的等待时间,反之,响应等待更长。

从上面几个方式来看,业务客户端能够做的一部分其实是缩小网络包的大小,那么我们下面介绍一下缩小网络包研究。

收益

▐缩小接口网络数据包方案与收益

 

  • 缩小网络包,是否真的会对网络的传输有效果呢?

 

我们对数据包的大小与网络传输时长做了一个线下的实验,以下是实验的数据:


 

其他条件不变,我们将一页返回数据改变后的数据;

可以看出网络传输时间与数据包的大小是有着正相关的关系的。

 

  • 减少网络包大小有哪些措施呢?

 

更优的压缩算法

不同的压缩算法,压缩算法是不一样的:


 

图片来源于网上大佬的图片

但是,压缩算法的调整需要考虑方面很多,如果仅仅是网络时间的收益在很多场景下可能成本较高,暂未考虑。

减少返回数据个数

减少返回数据个数,服务端的同学已经在投入,但是遇到了一个问题,数据个数的减少就需要增加请求的次数,机器资源的成本就会升高,需要申请机器的资源;那就比较尴尬了,本身是优化,却让成本来买单。

精简返回字段

在原有的请求数据上通过精简字段,减少数据包的大小。这样既能降低数据包,成本又不增高。如何做呢?下面来研究一下。

▐精简数据报文

 

  • 做一个实验

 

一个接口的分页接口数据包大小在1.5M左右,Server使用的是gzip(best模式)的压缩方式,我进行压缩后的大小为106KB左右。通常其他接口数据包大小压缩后普遍在10KB以下,所以可以看出分页接口横向对比来看,数据包大小是非常严重的。这也是为什么会选择精简数据报文作为优化手段一大原因。

 

  • 分析

 

精简数据报文需要根据业务的场景来看,我这里来举一个我这边实践的例子:

从数据包上分析,业务A的数据占比59.8%,而且该业务数据元素字段重复率非常高,来看一下去除该业务后的数据包大小:

原始数据

精简后

降低率

59.8%

从数据比对来看,不同的卡片有大约18处的不同,其占比:

占比 = 1 - (5350 / 17439) ≈ 0.693

那么,此时就有一个问题了,重复的数据,经过压缩后还会占包大小吗?

所以我就用服务端的压缩方式对数据做了个压缩:

原始数据

精简后

原始数据Gzip压缩

精简后Gzip压缩

降低率

59.8%

90%

95%

数据表明,针对重复字段的精简,压缩后依然是有效的。


 

压缩后降低率依然有46.9%。

拿到这个结果后,如何做呢?

▐数据查找表

将重复的业务数据在第一页的数据中建立字段的查找表,然后通过端上进行合并操作,具体方式:


 

但是,与服务端的同学对方案时,发现请求的第一页数据放置查找表,服务端不容易实现,因为数据在下游。

调整方案,将数据查找表改放置在每一页数据中,这样服务端更改就非常少了,实现也比较简单。

但是数据放在每一页,压缩后还会有收益吗?来看一下实验的结果:

采用压缩方式:gzip的压缩方式

压缩比:best模式(系统缺省值6)

方案1:

将负反馈数据查找表放在第一页数据中:


 

优化前后:降低45KB

降低率 :1 - 61 / 106 ≈ 42.2%

方案2:

将负反馈数据查找表放置于每一页数据的头部:


 

优化前后:降低43KB

降低率 :1 - 63 / 106 ≈ 40.5%

实验发现,查找表的数据仅仅占用2KB,优化依然有效。

▐优化效果

 

  • 精简报文

 

在原有的数据包下,线下实验,精简字段会将数据包从106KB降低至63KB;线下的实验可以得到接近90ms的优化;

 

  • 缩小返回数据个数

 

缩小接口返回数据的个数,从50个降低至20个,数据大小大约降低63KB,网络传输耗时减低107ms;

结论

 

  1. 数据包的大小对于接口的性能、响应以及失败率都有影响
  2. 在一定场景下,数据中的重复字段对压缩后数据包依然有较大的影响。

 

注:

 

  1. 网络传输使用的是服务端的压缩包,所以大小要看压缩后的包大小
  2. 精简报文有很多同学可能都试过,实现后发现收益很小,所以需要先衡量包的大小会不会对网络传输造成影响,如果仅仅是几KB的优化,从上面实验可以看出,基本收益不大,如果是上百KB,收益肯定是有的。

 

团队介绍

我们是大淘宝技术-用户产品技术,团队主要负责电商核心基础链路业务和平台的研发,包含:手机淘宝首页、信息流、NewDetail、商品详情、购物车、全域触达、分享购物车、消息平台等电商核心基础能力及创新型业务。这里有世界一流的技术产品,有超大的电商基础场景,有百亿级别的数据、有超过百万QPS的高并发流量,有丰富的业务场景,服务于10亿级的消费者,这里有巨大的挑战等着你的到来。

作者:马啟超(是也)

出处:https://mp.weixin.qq.com/s/NYUuP1mG2o1E6QkVUoRjiw



Tags:接口优化   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
性能优化之接口优化
本文从客户端的视角,分享客户端如何协同服务端进行接口时间的优化。Compose是什么接口性能优化对于客户端的同学来讲涉及可能不是很多,但是接口的性能对于客户端的体验影响是...【详细内容】
2022-10-20  Search: 接口优化  点击:(390)  评论:(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)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条