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