Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringBoot,GraphQL性能泄漏_Java_Kotlin_Graphql - Fatal编程技术网

Java SpringBoot,GraphQL性能泄漏

Java SpringBoot,GraphQL性能泄漏,java,kotlin,graphql,Java,Kotlin,Graphql,给定的是一个SpringBoot应用程序,它承载一个graphQL服务器。它使用了许多数据加载器,它们本身的性能似乎很好,但我注意到一个非常大的性能泄漏与它们相关(或介于两者之间),我无法清楚地缩小范围,但可以测量它 问题 一些(UI)客户端从服务调用GraphQLAPI查询,这将触发提取x元素(x>10000) GraphQLQueryResolver在SpringBoot服务内部调用,它获取x元素 调用字段getter的函数,这些函数从加载的数据加载器返回CompletionStage 需要

给定的是一个SpringBoot应用程序,它承载一个graphQL服务器。它使用了许多
数据加载器
,它们本身的性能似乎很好,但我注意到一个非常大的性能泄漏与它们相关(或介于两者之间),我无法清楚地缩小范围,但可以测量它

问题
  • 一些(UI)客户端从服务调用GraphQLAPI查询,这将触发提取
    x
    元素(
    x>10000
  • GraphQLQueryResolver
    在SpringBoot服务内部调用,它获取
    x
    元素
  • 调用字段getter的函数,这些函数从加载的数据加载器返回
    CompletionStage
  • 需要很长时间的事情
  • DataLoader
    使用批处理键调用实现类并返回结果
  • 示例日志如下所示:

    2020-06-19T18:25:14.196Z [http-nio-80-exec-10] ~ Shopping ~ INFO  ~ It took |> PT0.095S <| for 'orders query with filter:[OrderFilter(col=createdAt, operator=BETWEEN, value=2020-01-05T00:00:00Z AND 2020-05-31T00:00:00Z)]'
    2020-06-19T18:25:18.686Z [DefaultDispatcher-worker-6] ~ Shopping ~ INFO  ~ It took |> PT0.001S <| for 'orderKpiDataLoader' (PT0.000000095S on average for #10476 executions)
    2020-06-19T18:25:23.229Z [DefaultDispatcher-worker-19] ~ Shopping ~ INFO  ~ Start 'priceForOrderReferences'
    2020-06-19T18:25:24.840Z [DefaultDispatcher-worker-41] ~ Shopping ~ WARN  ~ It took |> PT1.613S <| for 'orderDepositDataLoader' (PT0.00015397S on average for #10476 executions)
    
    我自己的解决方案:


    调用数据加载程序之间的时间间隔会发生什么?(那些 +4.49秒和+4.54秒)

    我仍然不确定到底是什么让它慢下来,但这似乎是graphql-java依赖性的问题。在graphqljava脚本实现中执行类似查询时,时间延迟约为~60ms

    我怎样才能减少它

  • 我找到了一个方法,在这个方法中,我采纳了建议,提前在顶层加载更多数据。通过这种方式,还可以创建包含更多数据的自定义类,并可以减少较低级别上的冗余存储库路径
  • 为了避免数据加载器在执行函数之前等待“收集”密钥的时间,您可以选择某些路径,并自己在上层执行加载器
  • 围绕不同数据加载器的批处理大小进行游戏
  • 如果你想简化答案,可以是:“如果你想快速,不要深入”



    我仍在寻求其他解决方案。

    性能泄漏?减速可能是一个更好的词(泄漏通常与资源相关,如内存中的资源)。如果有某种小型的、自包含的示例再现问题,那么回答这个问题就会容易得多。现在你要看的东西太多了,问题只涉及部分内容。@tucuxi是的,你说得对。赏金结束后我会改名。考虑到“需要查看的堆栈太多”,这已经是一个简化版本。如果我漏掉更多,它可能不再代表我的情况——我不知道可以漏掉什么,因为我不知道出了什么问题。探查器还可以帮助您确定时间花在哪里,而无需进行大量手动检测。
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphql-kickstart-spring-boot-starter-tools</artifactId>
        <version>7.0.1</version>
    </dependency>
    
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphql-java-tools</artifactId>
        <version>6.0.2</version>
    </dependency>
    
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.7.RELEASE</version>
    
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphql-spring-boot-starter</artifactId>
        <version>7.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.apollographql.federation</groupId>
        <artifactId>federation-graphql-java-support</artifactId>
        <version>0.4.1</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>playground-spring-boot-starter</artifactId>
        <version>7.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java</groupId>
        <artifactId>graphql-java-extended-scalars</artifactId>
        <version>1.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java</groupId>
        <artifactId>java-dataloader</artifactId>
        <version>2.2.3</version>
    </dependency>