节前,有朋友约我聊聊API设计。那时候感觉好像有千言万语,却很难脱口而出1、2、3,原来即使在日常工作中,也缺乏系统的思考和条理。API设计涉及到很多方面,分类是一种基本的思路。如果你能形成一个系列的话,让我们从表演开始吧。与任何性能一样,API性能主要取决于它如何响应不同类型的请求。例如:一个典型的电子商务场景,展示用户当前的订单。该应用程序从API获取订单详细信息。但是,如果你想让用户在一个地方看到他们所有的订单,这意味着我们的API现在将返回比以前更多的数据,并且后台的负载会更大。如何确保我的API可以将所有数据返回给用户,而不会出现延迟、服务器错误和请求过多等问题?通常,如何提高API设计的性能?我还没有整理出完整的方法论,只是就RESTAPI而言,根据多年的经验和教训,这里有10条建议。1、开启日志和建立监控API监控最重要,没有之一。拥有日志、监控和警报可以帮助我们在潜在问题成为真正问题之前对其进行诊断和纠正。如果未启用日志记录,并且存在潜在问题,那么我们将无法跟踪性能指标,或查明特定请求中出现问题的位置。稍微奢侈一点,试试全链路跟踪系统,虽然成本高一些,但物有所值。2.提高网速,拥有足够的带宽即使API设计的性能很强大,也经不起缓慢的网络延迟。不可靠的网络会导致停机,从而导致违反SLA、服务条款和对客户的承诺。必须投资于适当的网络基础设施,以便我们能够保持所需的性能水平,有时可以通过利用和购买足够的云资源来实现。3.减少负载如果响应数据的负载非常大,会减慢请求完成时间并影响性能。简单地说,使用GZip压缩来减少负载大小,您可以在WebAPI上使用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是yesput是delete是postnonopatchisnono例如,PUT和PATCH操作在更新资源方面类似,但是执行更新的方式不同。PUT操作通过向整个资源发送更新来更新资源。PATCH操作仅对需要更新的资源应用部分更新。由此产生的PATCH调用可以导致更小的有效负载,从而提高性能。请注意,PATCH调用不是幂等的。7.尝试标准的HTTP状态代码我们可以进一步标准化、分段和限制响应,这有助于降低结果的复杂性并通过仅针对客户要求的内容提供响应/结果来改善整体客户体验。尝试使用标准的HTTP状态代码是个好主意,显然,响应的状态由其状态代码指定:1xx表示信息,2xx表示成功,3xx表示重定向,4xx表示客户端错误,5xx表示服务器错误。例如,使用HTTP状态代码,并且仅使用响应主体提供错误详细信息。HTTP/1.2400BadRequestContent-Type:application/json{"error":"Expectedxxxinxxx"}8.动静分离,使用CDN另外,如果后台进程较多,可以运行这些在单独的线程上处理,以避免阻塞请求。一种常见的方法是将API请求中的静态资源分离,您可以使用内容分发网络(CDN)来更快地服务来自不同区域的请求中的静态资源。9.启用分页、过滤和排序对于大型数据集,限制返回的数据量是至关重要的。此外,您可能希望指定资源的字段或属性以包含在响应中,从而限制返回的数据量,最终希望查询特定值并对返回的数据进行排序。分页有助于从多个响应中创建大量内容。这种优化有助于提高响应能力,同时保留传输/显示给客户端的数据。当响应中返回链接时,API变得更加自描述。对于支持分页的响应中返回的集合,“first”、“last”、“next”和“prev”链接至少是有益的。10、使用性能更好的应用框架应用框架用于提高开发效率。如果对性能进行适当的优化和增强,它还可以为企业和客户提供极其强大的体验。有些框架是专门为构建RESTAPI而设计的,可以帮助我们在不牺牲生产力的情况下提高性能。比如在python中,有很多的web应用框架,比如Django、Flask、Tornado、Falcon等等。在性能方面,Falcon和Tornado可能是不错的选择。在Node中,Restify似乎也是一个不错的选择,但我没有在生产环境中尝试过,基于Go语言的应用框架非常值得关注。总之,业务需求和客户期望总是随时间变化,我们有责任决定如何以高效的方式构建高性能API,这可以帮助我们实现并超越我们的目标。根据具体的API和用例,确定API与哪些服务交互、调用频率、从何处等,我们可以通过不同的方式实现高性能API。
