我正在构建基于GraphQL的API(使用Java) 为了优化它,利用“ DataLoader”批处理策略似乎是解决问题的好方法。
我的主要准则是按照建议为每个请求创建一个“ DataLoader”实例。
我想知道的是;我应该在哪里放置“ DataLoader”实例? 看来我有几个选择:
创建一个实例(按类型),将其存储为“上下文”,然后在适当的解析器中使用它。
这种方法的优点是,服务层将它作为graphQL东西(有点?)而忽略了“ DataLoader”。
(优选)为每个服务创建一个实例,并在适当的时候使用它。
例如,假设有一个名为“ CharacterService”的服务,它有几种使用下面的数据层返回“ Character”的方法。
专业人士:
解析程序不应在
上下文,无论何时调用它们,“ DataLoader”方法都是集中的
在服务中,“批处理”在GraphQL领域之外使用。
缺点:
服务方法将从同步返回类型变为异步,例如:
公共字符getCharacter(){...}
//变为:
public CompletableFuture
此外,如果一个服务被实例化不止一次,则批处理/缓存将受到影响,因为将有两个数据加载器执行完全相同的操作,只是具有不同的缓存和生命周期。
混合-接受服务,并基于服务接口创建另一个实例,该实例将使用组合和委托方法调用组合的服务,并以“ DataLoader”实例为后盾。
但这很难维护,因为它将转化为两倍的维护成本。
我想听听您的想法,因为我可能想念一些东西。