可以有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 基本上会收集它们并像级联一样解析资源。请求流入队列并保留在那里,直到执行周期结束。然后它们都立即“发布”(并且可能可以分批解决)。此外,交付的Promise
s 也会立即全部解决(即使某些结果比其他结果更早出现)。这使得下一个执行级别也可以在一个周期内发生。
去重:假设您获取BlogPost
的列表,其中包含author
类型为User
的字段。在此列表中,同一作者撰写了多篇博客文章。当同一个密钥被请求两次时,它只会被传递给批处理功能一次。然后,Dataloader 将通过解决相应的 Promise 来处理返回资源。
关键是 (1) 和 (3) 可以通过一个不错的 http 客户端来实现,该客户端缓存 requests(不仅是响应,这意味着当一个请求被缓存时不会触发另一个请求)已经为该资源运行)。这意味着有趣的问题是您的 REST API 是否支持批处理请求(例如,一个请求中的 api/user/1,2
而不是 api/user/1
和 api/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 调用吗?阿帕奇点燃