API设计中性能提升的10个建议

简介: API设计中性能提升的10个建议

【引子】节前的时候, 一好友约我聊一聊API 的设计。当时觉得仿佛有万语千言,但我又难以脱口而出1、2、3。原来,即便是工作的日常,也缺乏一个系统性的思考和整理。API的设计涉及到的方面很多, 分类是一个基本的思考方式。如果可以形成一个系列性的文字,那就从性能开始吧。


就像任何性能一样,API 性能主要取决于如何响应不同类型的请求。例如:典型的电商场景,显示用户当前的订单。应用程序从一个 API 获取订单详情。但是,如果希望用户在一个地方能查看他们所有的订单,这意味着,我们的 API 现在将返回比以前更多的数据,后台的负载会更大。如何确保我API 能够将所有数据返回给用户,而不会出现延迟、服务器错误和过多请求等问题呢?

一般地, 如何在API设计中提升性能呢?还没有梳理出完整的方法论,但就REST API 而言,根据多年的经验和教训,这里总结了10点建议。

1 启用日志,建立监控

API 的监控是最重要的,没有之一。

拥有日志、监控和告警可以帮助我们在潜在问题变成真正问题之前诊断并纠正问题。如果没有启用日志记录,并且存在潜在问题,那么我们将无法跟踪性能指标,或者在特定请求中定位问题发生的位置。奢侈一点的话, 要尝试全链路跟踪系统,尽管成本较高,但物有所值。

2 提升网速,带宽足够

即便API设计的性能非常强大,也扛不住缓慢的网络延迟。不可靠的网络可能会导致宕机,导致违反SLA、服务条款以及曾经向客户做出的承诺。必须要投资适当的网络基础设施,以便我们能够维持所需的性能水平,有时候,可以通过利用和购买足够的云资源来实现。

3 减少有效负载

如果响应数据的有效负载非常大,将会减慢请求完成的时间,并影响性能。简单地,使用 GZip 压缩来减少有效载载的大小,可以在 Web API 上使用 Deflate 压缩,或者,可以将 Accept-EncodingRequest 更新为 gzip。有效的数据压缩减少了在 web 应用程序上响应的下载量,同时提高了上传速度。

4 使用缓存

缓存是提高 API 性能的最简单的方法之一。如果有经常返回相同响应的请求,那么该响应的缓存有助于避免额外的服务调用和数据库查询。需要注意的是,确保在缓存使用的生命周期,尤其是在发生数据更新的时候。缓存增强了可伸缩性。服务端可以通过设置响应头来提高缓存能力,比如 Cache-Control、 Expires、 Pragma、 Last-Modified 等等。

5 流控与频控

API 遭受 DDoS 攻击是恶意的,但有时候,也可能是工程师无意造成的,例如当工程师在某个本地应用程序的循环中执行调用 API 的调用。一般地,可以通过监视每个 IP 地址或每个 SSO令牌发生的事务数量来避免这种情况。频控和流控都是为了性能而实现限速的方式,有助于处理API的意外调用,并主动监视和识别可能的恶意活动,也是实现安全性的重要手段。

6 尝试HTTP 的标准方法

尝试使用HTTP 的标准方法,对API 的性能会有一定的帮助。

http 方法  幂等性  是否安全
get 是 
head  是 
put 
delete 
post 
patch  否 


例如,PUT 和 PATCH 操作在更新资源方面是相似的,但执行更新的方式是不同的。PUT 操作通过向整个资源发送更新来更新资源。PATCH 操作只对需要更新的资源应用部分更新。由此产生的 PATCH 调用可以产生更小的有效负载,从而提高性能。需要注意的是PATCH 调用可不是幂等的。

7 尝试标准的HTTP 状态码

我们可以进一步对响应进行标准化、细分和限制,这有助于降低结果的复杂性,并通过仅针对客户所要求的内容提供响应/结果来改善整个客户体验。尝试使用标准的HTTP 状态码是一种不错的方式,显然,响应的状态由其状态代码指定: 1xx 表示信息,2xx 表示成功,3xx 表示重定向,4xx 表示客户机错误,5xx 表示服务器错误。例如,使用 HTTP状态码,并且只使用响应体提供错误细节。

HTTP/1.2 400 Bad Request
Content-Type: application/json
{
    "error": "Expected xxx in xxx"
}

8 动静分离,使用CDN

此外,如果有大量的后台进程进程,可以在单独的线程上运行这些进程,以避免阻塞请求。常见的一种方式是将API请求中的静态资源分离开了,可以使用内容交付网络(CDN)来更快地服务不同地区请求中的静态资源。

9 启用分页,过滤排序

对于大型数据集,限制返回的数据量是至关重要的。此外,可能希望指定要包含在响应中的资源的字段或属性,从而限制返回的数据量,最终希望查询特定的值并对返回的数据进行排序。

分页有助于从多个响应创建大量的内容。这种优化有助于改进响应,同时保存传输/显示给客户的数据。当链接在响应中返回时,api 变得更具自我描述性。对于在支持分页的响应中返回的集合,“ first”、“ last”、“ next”和“ prev”链接至少是有益的。

10 使用性能更优的应用框架

应用框架的使用是为了提高开发效率,如果为了性能进行适当的优化和增强,也可以为业务和客户提供极其强大的体验。一些框架专门用于构建 REST API,可以帮助我们在不牺牲生产力的前提下提升性能。例如,在python中,web 应用框架众多,例如 Django ,Flask,Tornado,Falcon等等。就性能而言,Falcon和Tornado可能是不错的选择。在 Node 中,Restify 似乎也不错的选择,但是我还没有在生产环境来尝试它,基于Go 语言的应用框架更是非常值得关注的。

总之,业务需求和客户期望总是随着时间而变化的,我们有责任决定如何以高效的方式构建高性能的API,这样可以帮助我们实现并超越目标。根据特定的 API 和用例,确定API与什么服务交互,以及调用的频率,从哪里调用等等,我们可以用不同的方式实现高性能的API。


相关文章
|
2月前
|
缓存 前端开发 JavaScript
如何优化前端性能提升用户体验
在Web应用中,前端性能是影响用户体验和转化率的关键因素之一。本文将介绍一些优化前端性能的方法,包括减少HTTP请求、使用缓存、压缩代码等。
|
监控 算法 测试技术
性能优化之几种常见压测模型及优缺点 | 陈显铭
上一篇讲的是《性能优化的常见模式及趋势》,今天接着讲集中常见的压测模型。通过上一章我们大概知道了性能优化的一些招式,但是怎么发现有性能问题,常见的模式还是需要压测。
5729 0
|
8月前
|
存储 编译器 C语言
性能优化特性之:LTO
本文介绍了倚天实例上的编译优化特性:LTO,并从优化原理、使用方法进行了详细阐述。
|
8月前
|
编译器 C++ Anolis
性能优化特性之:PGO
本文介绍了倚天实例上的编译优化特性:PGO,并从优化原理、使用方法进行了详细阐述。
|
11月前
|
SQL 缓存 NoSQL
记一次接口性能优化实践总结:优化接口性能的八个建议
最近对外接口偶现504超时问题,原因是代码执行时间过长,超过nginx配置的15秒,然后真枪实弹搞了一次接口性能优化。在这里结合优化过程,总结了接口优化的八个要点,希望对大家有帮助呀~
|
缓存 监控 安全
API设计中性能提升的10个建议
API设计中性能提升的10个建议
|
缓存 前端开发 JavaScript
前端性能中重要概念之性能优化方案
前端性能优化方案 在现代Web应用中,前端性能是非常重要的一环。在开发过程中,开发者需要寻找和实施各种前端性能优化方案,以提升应用的性能和用户体验。下面介绍一些常用的前端性能优化方案:
118 0
|
存储 缓存 固态存储
如何写出高性能代码(四)优化数据访问
同一份逻辑,不同人的实现的代码性能会出现数量级的差异; 同一份代码,你可能微调几个字符或者某行代码的顺序,就会有数倍的性能提升;同一份代码,也可能在不同处理器上运行也会有几倍的性能差异;十倍程序员不是只存在于传说中,可能在我们的周围也比比皆是。十倍体现在程序员的方法面面,而代码性能却是其中最直观的一面。
115 0
如何写出高性能代码(四)优化数据访问
|
SQL 缓存 JSON
性能优化之接口优化
本文从客户端的视角,分享客户端如何协同服务端进行接口时间的优化。
299 0
性能优化之接口优化
|
缓存 负载均衡 NoSQL
接口性能优化方案及其理论依据
我们现在接口的线上问题主要有三个,第一:启动时有些机器会有短暂的线程池满。第二:并发量上不去,怕服务被打死,不敢调高限流阈值。第三:499超时现象。   今天终于把那天说的全量执行时间延长,从图中可以看到,中午12点发版之后,内存使用率有明显下降,晚上是接口调用高峰,会有上浮,但是总体来看还是下降了。
接口性能优化方案及其理论依据