另一个用户的这个问题/答案对idempotent
的含义很有帮助:
What is an idempotent operation?
在Rest API
方面,由于可以快速启用GET请求的缓存(如果尚未启用),因此,如果用户想要获取某些examples: /users/:id
或/posts/:id
,他们可以这样做。尽可能多的次数,并且它不应变异任何数据。
如果我正确理解,在这种情况下,GET请求是幂等的。
问题
我相信Relay
和Dataloader
可以在缓存方面帮助GraphQL查询,但不能解决浏览器/移动缓存的问题。
答案 0 :(得分:3)
首先,缓存和幂等是不同的东西,不一定相互关联。缓存可能会也可能不会用于实现幂等操作 - 这当然不是必需的。
其次,当谈到 HTTP 请求时,幂等性本质上关注的是服务器的状态而不是它的响应。 如果执行多次,幂等操作将使服务器处于完全相同的状态。这并不意味着幂等操作返回的响应将是相同的(尽管它们通常可能是相同的)。
REST 中的 GET 请求预期是合约幂等的 - 即 GET 操作不能对服务器产生任何状态改变的副作用(技术上这可能并不总是正确的,但对于为了解释,我们假设它是)。这并不不意味着如果您多次获取相同的资源,您将始终获得相同的数据。实际上,这是没有意义的,因为资源会随着时间的推移而变化,也可能会被删除,对吗?因此缓存 GET 响应有助于提高性能,但与幂等性无关。
另一种看待它的方式是查询资源而不是任意数据。 GET 请求是幂等的,因为您将始终获得相同的资源,并且您不会以任何方式修改系统的状态。
最后,在服务器端开发不佳(奇怪?)的 GET 操作可能会产生副作用,这将违反 REST 契约并使操作非幂等。在这种情况下,简单的响应缓存无济于事。
我喜欢将 GraphQL 查询 视为等同于 REST 中的 GET。这意味着如果您在 GraphQL 中查询数据,解析器必须不执行任何副作用。这将确保多次执行相同的查询将使服务器保持不变的状态。
就像在简单的 GET 中查询特定的资源一样,尽管与 GET 不同,GraphQL 允许您一次查询多种不同类型资源的多个实例。再说一次,这并不意味着相同的响应,首先是因为资源可能会随着时间的推移而发生变化。
如果您的某些查询有副作用(即它们改变了服务器上资源的状态),则它们不是幂等的!您可能应该使用突变而不是查询来实现这些副作用。使用突变可以让客户/消费者清楚该操作不是幂等的,应该进行相应的处理(突变输入可以接受幂等键以确保类似 Stripe 的幂等性,但这是一个单独的主题)。
我希望现在很清楚缓存不需要确保/不是决定 GraphQL 查询幂等性的因素。它仅用于提高性能。
如果您仍然对 GraphQL 的服务器端缓存选项感兴趣,这里有很多资源。您可以先阅读 Apollo Server documentation 对该主题的看法。不要忘记,您还可以缓存数据库/服务/等。回应。我不打算提供任何具体建议,因为从您的问题来看,其他地方有更多的混乱。