我建立了一个graphQL服务器来包装多个Restful API。我将要集成的某些API是第三方,而有些是我们拥有的。我们使用redis作为缓存层。如果我在graphQL上实现数据加载器缓存,可以吗?会影响我现有的Redis缓存吗?
答案 0 :(得分:3)
很好的问题!
Dataloader不仅具有一种用途。实际上,数据加载器具有三个目的。
缓存:您提到了缓存。我假设您正在GraphQL API之前构建GraphQL网关/代理。在这种情况下,缓存意味着当您需要特定资源并且以后再次需要它时,您可以返回到缓存的值。这种缓存发生在您的JavaScript应用程序的内存中,通常不会与任何其他类型的缓存发生冲突,例如在网络上。
分批处理:由于查询可以嵌套得很深,因此最终您将到达在查询执行的不同部分中请求相同资源类型的多个值的地步。 Dataloader基本上将收集它们并像级联一样解析资源。请求流入队列,并一直保持在那里,直到执行周期结束。然后,将它们全部一次“释放”(并且可能可以分批解决)。交付的Promise
也会被立即解析(即使某些结果比其他结果更早出现)。这样一来,下一个执行级别也可以在一个周期内发生。
去重复:假设您抓取了BlogPost
类型为author
的字段User
的列表。在此列表中,同一作者已撰写了多个博客文章。当两次请求相同的密钥时,它将仅交付给批处理功能一次。然后,Dataloader将通过解决相应的承诺来负责将资源送回。
要点是(1)和(3)可以通过一个体面的http客户端来实现,该客户端缓存 requests (不仅是响应,这意味着当一个请求是已经为该资源运行)。这意味着有趣的问题是您的REST API是否支持批处理请求(例如,一个请求中的api/user/1,2
而不是api/user/1
和api/user/2
)。如果是这样,使用数据加载器可以大大提高API的性能。
也许您想用他们的RESTDatasource
:https://www.apollographql.com/docs/apollo-server/v2/features/data-sources.html#REST-Data-Source