有数据加载器和休息 api 缓存可以吗?

Is it okay to have dataloader and rest api caching?

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

很好的问题!

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

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

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

  3. 重复数据删除:假设您获取 BlogPost 的列表,其中字段 author 类型为 User。在此列表中,同一作者撰写了多篇博文。当同一个密钥被请求两次时,它只会被传递给批处理函数一次。然后,Dataloader 将通过解析相应的承诺来负责交付资源。

重点是 (1) 和 (3) 可以通过缓存 请求 的体面的 http 客户端来实现(不仅是响应,这意味着不会触发当该资源已经 运行 时的另一个请求)。这意味着有趣的问题是您的 REST API 是否支持批量请求(例如 api/user/1,2 在一个请求中而不是 api/user/1api/user/2)。如果是这样,使用数据加载器可以大大提高 API.

的性能

也许你想看看阿波罗现在正在用他们的RESTDatasource建造什么:https://www.apollographql.com/docs/apollo-server/v2/features/data-sources.html#REST-Data-Source