【问题标题】:Solving API Performance Issues with Cross Domain Ajax使用跨域 Ajax 解决 API 性能问题
【发布时间】:2016-01-15 00:56:10
【问题描述】:

我正在构建基础架构以支持我们打算扩展到数十万用户的游戏平台。由于这是在娱乐/游戏行业,我们预计每个用户会话都会产生沉重的负载,因此,性能是最重要的。

我们正在尝试尽可能多地并行化架构,这意味着 API、数据库和应用程序运行在可以水平扩展的不同服务器上。其中一个应用程序是 Web 应用程序,由于涉及旧版浏览器上的同源策略的特定场景,我们遇到了最大的麻烦。

在网络浏览器中运行的这个应用程序需要快速访问只能通过集中式 API 获得的模型。虽然这对我们的专用移动客户端来说非常有用,但不幸的是,浏览器需要完全支持 CORS 才能直接与我们的 API 交互。这是有问题的,因为并非所有浏览器都支持某些 HTTP 动词(放置/删除)。我们唯一已知的解决方法是,重写 API 以创建更多抽象(我们认为这不是最佳实践,并且会增加开发时间和潜在的性能)并使用 JSONP 仅使用 POST 或创建代理(这将增加额外的两条腿到旅行并加倍延迟性能)。

归根结底,我们将这个问题归结为...是仅有的两个选项吗,还是我们没有考虑其他一些问题,如果是,这些解决方案中的哪一个更适合游戏平台。

【问题讨论】:

  • 您是否使用 access-control-allow-methods 将 PUT 和 DELETE 列入白名单?

标签: javascript ajax performance api rest


【解决方案1】:

另一个需要考虑的选项是JSONP。通过包装 JSON 响应以使其能够作为脚本标记加载,您可以避免同源策略出现问题。

如果不详细了解应用程序,我无法谈论您的特定应用程序的性能问题。我认为您会在使用 JSONP 的服务器上看到类似的性能,因为您与其他方法的主要区别在于您连接了一个额外的字符串。

【讨论】:

  • 我们研究了 JSONP,这是其中一种选择,但它要求我们打破 RESTful 约定并将自己限制为 POST 动词。
【解决方案2】:

SOP 应该不是问题。将 JSONP 用于跨域请求。将答案包装在回调方法中对于您的服务器端部分来说不应该是问题,并且对于应用程序的其余部分应该是透明的。不会破坏 REST 风格。在客户端库中,JSONP 的使用对于应用程序的其余部分也应该是透明的。
那么,PUT 和 DELETE 是什么?只需执行 POST 并使用预期的方法设置 X-HTTP-Method-Override 标头。服务器端的 Web 服务处理程序应识别标头并使用标头中的方法暗示请求。对应用程序的其余部分都是透明的。

【讨论】:

  • 有趣,我没有意识到这可以做到。事实上,* 上的另一篇文章指出 PUT 和 DELETE 不能用 JSONP 完成。 (*.com/questions/5345493/…) 所以,1) 你是说这个标头将被一个 node.js REST 服务器或 PHP REST 服务器解释为 HTTP 动词? 2)这在IE8等旧浏览器中是否有效?
  • 我不确定,但只有当您想从远程 url 读取数据时才需要 JSONP。一个普通的 POST 可以发送到每个域?标题的解释必须在您的应用程序中完成。发送标头应该适用于每个浏览器。
【解决方案3】:

虽然 JSONP 确实具有“通用”支持,但它仍然有点老套,并且有一些负面影响:主要是您无法捕获错误。

JSONP 无处不在的原因是脚本标签发出的请求属于 CORS 规范所定义的“简单请求”的范围内。

我的观点?除了使用 JSONP,您还可以修改您的 API(或至少是其中最常访问的部分)以适应简单请求的范围。然后,您将获得处理错误的全部能力,而不会受到预检请求的任何性能影响。

对于必须使用预检请求的地方,可以缓存预检响应。

我在Two Strategies for Crossing Origins with Performance in Mind 有关于这项技术的完整文章

【讨论】: