【问题标题】:GraphQL GET response time is slow when comparing to RESTful与 RESTful 相比,GraphQL GET 响应时间很慢
【发布时间】:2019-11-10 02:56:02
【问题描述】:

我想测试 GraphQL 端点和 RESTful 端点的响应时间,因为我以前从未使用过 GraphQL,我将在我的下一个 Laravel 项目中使用它。

所以我使用Lighthouse PHP 包从我的 Laravel 应用程序提供 GraphQL 端点,并且我还创建了一个 RESTful 端点。

两个端点(GraphQL 和 RESTful)都旨在从我的本地数据库中获取所有用户(250 个用户)。

因此,根据我在这里注意到的测试,当我在Postman 上测试这两个端点时,RESTful 端点响应比 GraphQL 端点更快。

我能知道为什么 GraphQL 端点的响应比 RESTful 需要更多的时间,而两个端点都在获取相同的数据吗?

GET 请求的 GraphQL 端点结果(响应时间:88 毫秒)

POST 请求的 GraphQL 端点结果(响应时间:88 毫秒)

RESTful 端点结果(响应时间:44ms)

【问题讨论】:

  • 不分析就知道。我的猜测是,在此示例中,您为 graphql 所做的额外处理付费(计算选择集,仅返回必填字段),但没有获得任何回报。如果你想要真正的比较,做一些更复杂的请求
  • @kaz 您是否尝试过 POST 请求 graphql api 以获取用户列表。由于 graphql 遵循所有的 POST 请求。
  • @Ashok 在 GraphQL 官方文档 graphql.org/learn/serving-over-http 上,我已经通过 GET 请求发送了请求。无论如何,我会尝试使用 POST 请求,并让您知道。
  • @NirLevy 复杂请求是什么意思?
  • @Ashok 我已经通过 POST 请求发送了它,但响应时间仍然相同。您可以在我上面发布的带有问题的屏幕截图中看到结果。

标签: laravel graphql graphql-php


【解决方案1】:

天下没有免费的午餐。

GraphQL 提供了许多有用的功能,但这些相同的功能总是会产生一些开销。虽然 REST 端点可以有效地从某个来源提取数据并将其反刍回客户端,但即使对于相对较小的数据集,GraphQL 也将必须进行一些额外的处理来解析和验证每个个体响应中的字段。更不用说解析和验证请求本身所需的处理了。而且这种开销只会随着返回数据的大小而变大。

如果您要向 REST 端点(请求响应验证、支持部分响应、为单个响应字段设置别名的能力等)引入镜像 GraphQL 的其他功能,您会看到两者的性能差距缩小。尽管如此,它仍然有点像苹果和橘子的比较,因为 GraphQL 服务会经历某些动作,这仅仅是因为 spec 说要做的事情。

【讨论】:

  • Daniel,您推荐在 Laravel 中使用的 Lighthouse 的 graphlq-php 替代品吗?
【解决方案2】:

TLDR:您的 REST 示例简单且不那么复杂

在 Lighthouse 中,它正在创建一个 AST 来解析 graphql 请求和您的架构。然后它会传递所有的指令等等来找出你想要做什么。它还必须验证您的查询,看看您是否可以在架构上实际运行它。

根据您在应用程序中定义它的方式,它要经过很多步骤。然而,这可以通过多种不同的方式来减少,解析你的graphql schema can be cached,你可以cache the result,使用deferred fields(可能不会加速这个例子)。您可以在文档的performance section 中阅读更多相关信息。

如果您使用某种 REST 标准也必须解析数据,那么您并没有指定如何设置 REST。如果添加更多功能,则需要运行更多代码,从而提高加载速度。

【讨论】:

  • 你推荐在 Laravel 中使用的 Lighthouse 的 graphlq-php 替代品吗?
  • Rebing 和folklore 也有一个graphql 包。但我会说灯塔是其中最好的,具有最多的功能
【解决方案3】:

从 Lighthouse v4 开始,我们通过延迟加载架构中的最低要求字段和类型,显着提高了性能。事实证明,这会带来 3 到 10 倍的性能提升,具体取决于架构的大小。

对于这样一个简单的查询,您可能仍然无法击败单个 REST 端点。 Lighthouse 将开始在跨多个关系连接的嵌套更重的查询上大放异彩。

【讨论】:

    【解决方案4】:

    尝试在服务器上启用opcache。这将我的 gql 响应时间从 200 毫秒减少到 20 毫秒

    【讨论】:

      猜你喜欢
      • 2017-03-24
      • 1970-01-01
      • 2021-06-25
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多