如何优化 REST API 调用
Posted
技术标签:
【中文标题】如何优化 REST API 调用【英文标题】:How to Optimize REST API calls 【发布时间】:2013-10-12 04:55:31 【问题描述】:我正在构建 Mash up 移动应用程序。我需要调用我的 API Provider 并与 Facebook 、 twitter 等集成。在此过程中,我必须对同一个域一个接一个地进行多个 REST API 调用(当然具有不同的路径和查询参数)。此外,API 调用必须是连续的,因为需要调用下一个。我可以通过哪些方式优化这些 http 调用以避免往返。欢迎对 java 和 js 提出建议
【问题讨论】:
你可以在 REST API 端进行更改吗? @JunedAhsan 这似乎不太可能。正如一些 API OP 提到的是 FB Tw 等。 @Santosh 哦,我错过了,很糟糕 【参考方案1】:规定的要求很广泛。由于您使用的是公共第三方 API,这在一定程度上限制了可能的优化范围。您绝对无法做任何事情来加速 API,因为它们不属于您。
一般来说,我建议您遵循可以帮助您提出更好的应用程序的指南。
-
Thumb 规则是尽可能少地调用 API。
减少网络调用(由 API 调用产生)将意味着设备无线电(用于与服务器进行无线通信)的使用频率将降低,因此所需的功率也会降低。
现在,减少呼叫次数可能并不总是一种选择。因此,请仔细研究公共 API 文档,并确保您了解所需 API 的所有详细信息。
例如,可能有一个 API 可以在传递实体标识符时提供实体的详细信息。如果你需要 5 个这样的实体的详细信息,那么应该有一个 API,它接受一堆 ID 并一次返回所有详细信息。这样您就保存多个通话。
缓存是减少 API 调用次数的非常有效的方法。因此,请查找从服务器接收到的任何可以缓存一段时间的数据。
请注意,缓存需要更多内存,因此请确保您了解其含义并相应地决定需要缓存的数据量。
除了内存之外,数据也可以缓存在磁盘上,这将有助于减少内存使用。不确定您是否使用 android,请refer to this related post。
在旁注中,您可以参考以下链接,这些链接提供了开发移动应用程序的一般指南。
-
Make your application blazing fast。
Optimizing a Mobile App for Mobile network。
请注意,这些是一般准则。有些可能不适用于您的特定用例。
【讨论】:
【参考方案2】:如果您需要第一次 API 调用的结果来进行下一次 API 调用,那么您无法在客户端执行任何操作来避免每个 API 的顺序往返。要么需要一个现有的 API 调用,可用于将多个调用合并为一个调用,要么您需要将此类 API 调用添加到服务器,或者您需要使用代理服务器来代表您执行此操作。
如果您不需要第一次 API 调用的结果来进行下一次 API 调用,但您只想按顺序处理结果,那么您可以一次进行所有 API 调用并构建您的响应代码按顺序处理它们(保存任何乱序到达的结果以供以后处理)。
【讨论】:
【参考方案3】:REST 是统一的,因此,过滤器和往返行程是完成特定功能所必需的。当涉及到优化和将多个客户端请求模拟到 ONE 中时,您将慢慢开始面临统一范式的挑战,因为它的客户端可能比 ONE UNIFIED 调用中的合约更具体。虽然可以对 REST 进行大量优化以将 API 调用的数量减少到两个甚至一个调用,但有时,您的客户端请求将需要复杂的过滤,这需要在应用额外的过滤逻辑之前从服务器获得反馈。
如果您的要求是绝对必须有一个 API 调用来处理来自服务器而不是客户端的特定客户端请求,而所有过滤器都不适用,那么 RPC 将是您的选择,它会处理特定的业务以宁静的方式从服务器到其他微服务(SOA)的逻辑。
真正的问题是,如果您想保持 REST API 统一和一致并让客户端实现自己的独特逻辑,为什么还要让服务器来处理此类请求。 REST API 服务器应为客户端提供超链接/超媒体,以指导客户端以最佳方式减少 API 调用次数,无论是通过过滤还是任何其他实体/资源。
【讨论】:
【参考方案4】:编程级别 - 使用代码优化/线程/并行编程。
API 级别 - 使用分页/过滤器/范围来生成适合客户需求的细粒度数据。
缓存 - 在某处听说“最快的 HTTP 调用是你不做的那个”,即使用缓存(Memcache/Redis),大部分请求都是读取操作,明智地使用缓存控制标头也很有用。这使数据库免于服务昂贵的重复读取请求。 (不确定 Etags 是否有用?)
请求/响应 - 对通过网络传输的数据使用 JSON 序列化程序和 gZip 压缩技术。
地理位置 - 考虑到最终用户和源服务器之间的距离,我们可以使用 CDN 来存储响应的静态内容,以便能够真正快速地提供服务。
(听说过异步方法/反应式编程可以提高 API 的性能,但不太确定)
【讨论】:
【参考方案5】:如果你可以使用 jQuery,我建议你看看我的插件jQuery Chain,它可以帮助异步调用顺序。
【讨论】:
以上是关于如何优化 REST API 调用的主要内容,如果未能解决你的问题,请参考以下文章
如何从 JavaScript 调用 REST Web 服务 API?