可以有dataloader和rest api缓存吗?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案1】:

非常好的问题!

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

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

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

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

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

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

【讨论】:

以上是关于可以有dataloader和rest api缓存吗?的主要内容,如果未能解决你的问题,请参考以下文章

Apollo Server:如何从 REST API 数据源访问 Dataloader 中解析器之外的“上下文”

我可以将 JSON 传递给这个 REST API 调用吗?阿帕奇点燃

我可以将 E-tag 用于用户特定的 REST API,以免每次都发回相同的数据吗?

Dataloader如何缓存和批量数据库请求?

RESTful API 应该有模式吗?

Intranet API 的 REST 身份验证缓存