GraphQL DataLoader-每个服务层的加载器vs每个解析器

时间:2018-10-07 21:20:11

标签: java graphql graphql-java

我正在构建基于GraphQL的API(使用Java) 为了优化它,利用“ DataLoader”批处理策略似乎是解决问题的好方法。

我的主要准则是按照建议为每个请求创建一个“ DataLoader”实例。

我想知道的是;我应该在哪里放置“ DataLoader”实例? 看来我有几个选择:

  1. 创建一个实例(按类型),将其存储为“上下文”,然后在适当的解析器中使用它。
    这种方法的优点是,服务层将它作为graphQL东西(有点?)而忽略了“ DataLoader”。

  2. (优选)为每个服务创建一个实例,并在适当的时候使用它。
    例如,假设有一个名为“ CharacterService”的服务,它有几种使用下面的数据层返回“ Character”的方法。

    专业人士
    解析程序不应在 上下文,无论何时调用它们,“ DataLoader”方法都是集中的 在服务中,“批处理”在GraphQL领域之外使用。

    缺点
    服务方法将从同步返回类型变为异步,例如:

    公共字符getCharacter(){...}

    //变为:
    public CompletableFuture getCharacter(){...}

    此外,如果一个服务被实例化不止一次,则批处理/缓存将受到影响,因为将有两个数据加载器执行完全相同的操作,只是具有不同的缓存和生命周期。

  3. 混合-接受服务,并基于服务接口创建另一个实例,该实例将使用组合和委托方法调用组合的服务,并以“ DataLoader”实例为后盾。

    但这很难维护,因为它将转化为两倍的维护成本。

我想听听您的想法,因为我可能想念一些东西。

0 个答案:

没有答案