【问题标题】:Rest API vs GraphQL - IdempotentRest API vs GraphQL - 幂等
【发布时间】:2019-11-06 18:50:23
【问题描述】:

来自另一个用户的这个问题/回答对于idempotent 的含义非常有用:

What is an idempotent operation?

对于Rest API,由于 GET 请求的缓存如果尚未启用,可以快速启用,如果用户想要获取一些 examples: /users/:id/posts/:id,他们可以多次这样做d like,它不应该改变任何数据。

如果我理解正确,在这种情况下 GET 请求是幂等的。

问题

我相信 RelayDataloader 可以在缓存方面帮助 GraphQL 查询,但不能解决浏览器/移动缓存问题。

  • 如果我们只讨论 GraphQL 的 GET 请求部分,它是单个端点的一部分,我可以使用什么技术/功能或其他方式,这将解决常规 http 请求提供缓存方面的好处。李>

【问题讨论】:

  • 请将您的问题限制在每个帖子一个。已经有几个关于 GraphQL 缓存策略的问题,比如this one。此外,询问 GraphQL 与 REST 的用例示例非常广泛,可能会引发固执己见的答案。也许这个问题可以简单地提炼成“什么 GraphQL 请求,如果有的话被认为是幂等的?”
  • @DanielRearden 感谢反馈,已修改,请查看。

标签: rest graphql idempotent


【解决方案1】:

幂等性与缓存

首先,缓存和幂等是不同的东西,不一定相互关联。缓存可能会或可能不会用于实现幂等操作 - 这当然不是必需的。

其次,当谈到 HTTP 请求时,幂等性本质上关注的是服务器的状态,而不是它的响应。 如果多次执行幂等操作,服务器将处于完全相同的状态。这并不意味着幂等操作返回的响应将是相同的(尽管它们通常可能是相同的)。

REST 中的 GET 请求预计在契约上是幂等的 - 即 GET 操作不得对服务器产生任何改变状态的副作用(从技术上讲,这可能并不总是正确的,但对于为了解释,让我们假设它是)。这确实意味着如果您多次获取相同的资源,您将始终获得相同的数据。实际上,这没有任何意义,因为资源会随着时间的推移而变化,并且也可能会被删除,对吧?因此缓存 GET 响应有助于提高性能,但与幂等性无关。

另一种看待它的方式是您查询的是资源,而不是任意数据。 GET 请求是幂等的,因为您将始终获得相同的资源,并且您不会以任何方式修改系统的状态。

最后,在服务器端开发不佳(奇怪?)的 GET 操作可能会产生副作用,这将违反 REST 契约并使操作非幂等。在这种情况下,简单的响应缓存将无济于事。

GraphQL

我喜欢将 GraphQL 查询 视为等同于 REST 中的 GET。这意味着如果您在 GraphQL 中查询数据,解析器必须执行任何副作用。这将确保多次执行相同的查询将使服务器保持不变的状态。

就像在简单的 GET 中查询特定的资源一样,尽管与 GET 不同,GraphQL 允许您一次查询许多不同类型资源的多个实例。再次重申,这并不意味着相同的响应,首先是因为资源可能会随着时间而变化。

如果您的某些查询有副作用(即它们改变服务器上资源的状态),它们就不是幂等的!您可能应该使用突变而不是查询来实现这些副作用。使用突变可以让客户/消费者清楚地知道该操作不是幂等的,应该进行相应的处理(突变输入可以接受幂等键以确保类似 Stripe 的幂等性,但这是一个单独的主题)。

缓存 GraphQL 响应

我希望到现在为止,很明显不需要缓存来确保 / 不是决定 GraphQL 查询幂等性的因素。它仅用于提高性能。

如果您仍然对 GraphQL 的服务器端缓存选项感兴趣,这里有很多资源。您可以先阅读 Apollo Server documentation 关于该主题的内容。不要忘记您还可以缓存数据库/服务/等。回应。我不会提供任何具体的建议,因为从你的问题来看,其他地方有更多的混乱。

【讨论】:

    猜你喜欢
    • 2017-05-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2021-10-14
    • 2017-12-11
    • 2020-12-12
    相关资源
    最近更新 更多