【问题标题】:Is it okay to have dataloader and rest api caching?可以有dataloader和rest api缓存吗?
【发布时间】:2018-12-14 17:08:57
【问题描述】:

我构建了一个 graphQL 服务器来包装多个 RESTful API。我将集成的一些 API 是第三方的,一些是我们拥有的。我们使用 redis 作为缓存层。如果我在 graphQL 上实现数据加载器缓存可以吗?它会影响我现有的 redis 缓存吗?

【问题讨论】:

    标签: reactjs graphql apollo graphql-js apollo-client


    【解决方案1】:

    非常好的问题!

    Dataloader 不仅有一个目的。实际上,dataloader 服务于三个目的。

    1. 缓存:您提到了缓存。我假设您正在 GraphQL API 前面构建一个 GraphQL 网关/代理。在这种情况下,缓存意味着当您需要特定资源并且稍后您将再次需要它时,您可以返回到缓存的值。这种缓存发生在您的 JavaScript 应用程序的内存中,通常不会与任何其他类型的缓存冲突,例如在网络上。

    2. 批处理:由于查询可以嵌套得很深,您最终会在查询执行的不同部分请求相同资源类型的多个值。 Dataloader 基本上会收集它们并像级联一样解析资源。请求流入队列并保留在那里,直到执行周期结束。然后它们都立即“发布”(并且可能可以分批解决)。此外,交付的Promises 也会立即全部解决(即使某些结果比其他结果更早出现)。这使得下一个执行级别也可以在一个周期内发生。

    3. 去重:假设您获取BlogPost 的列表,其中包含author 类型为User 的字段。在此列表中,同一作者撰写了多篇博客文章。当同一个密钥被请求两次时,它只会被传递给批处理功能一次。然后,Dataloader 将通过解决相应的 Promise 来处理返回资源。

    关键是 (1) 和 (3) 可以通过一个不错的 http 客户端来实现,该客户端缓存 requests(不仅是响应,这意味着当一个请求被缓存时不会触发另一个请求)已经为该资源运行)。这意味着有趣的问题是您的 REST API 是否支持批处理请求(例如,一个请求中的 api/user/1,2 而不是 api/user/1api/user/2)。如果是这样,使用 dataloader 可以大大提高 API 的性能。

    也许您想通过他们的RESTDatasourcehttps://www.apollographql.com/docs/apollo-server/v2/features/data-sources.html#REST-Data-Source 了解 Apollo 现在正在构建什么

    【讨论】:

      猜你喜欢
      • 2015-06-16
      • 2021-10-29
      • 2013-11-11
      • 2010-12-30
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      相关资源
      最近更新 更多