【问题标题】:AsyncFutureCompletionExecutor vs Netty event loopAsyncFutureCompletionExecutor vs Netty 事件循环
【发布时间】:2020-06-19 14:08:04
【问题描述】:

我正在使用适用于 Java 2.0 的 AWS 开发工具包以及 Netty HTTP 客户端,我注意到有两个不同的线程池可以有效地处理响应。第一个是 ThreadPoolExecutor,可以像这样作为服务客户端本身的一部分被覆盖

DynamoDbAsyncClient dynamoClient = DynamoDbAsyncClient.builder()
                .httpClient(httpClient)
                .asyncConfiguration(ClientAsyncConfiguration.builder()
                        .advancedOption(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR, awsSdkFutureCompletionExecutor)
                        .build())

第二个是 Netty HTTP 客户端的事件循环。根据我加入线程的位置,我可以看到它由aws-java-sdk-NettyEventLoopsdk-async-response 线程池处理。

如果我调用dynamoClient.query(request).join(),我可以看到aws-java-sdk-NettyEventLoop 继续任何进一步的处理,而dynamoClient.query(request).whenComplete(...) 意味着sdk-async-response 线程正在执行处理。

有推荐的方法吗?我应该更喜欢在一个线程池中进行处理而不是在另一个线程池中进行处理吗?

【问题讨论】:

    标签: java multithreading asynchronous aws-java-sdk-2.x


    【解决方案1】:

    我怀疑我实际上知道这个问题的答案。我相信响应会移交给sdk-async-response 线程池,以防止有人在响应处理程序中对请求进行阻塞调用,从而阻塞 Netty 事件循环。所以要回答我自己的问题,我认为响应处理应该在sdk-async-response 线程池中完成。在未来的版本中,最好不要在 Netty 事件循环之外传递响应,但需要注意的是,但目前这似乎是不可能的。

    【讨论】:

    • 如果您确信不会在完成线程上执行任何阻塞操作,您可以通过将Runnable::run 指定为SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR 来禁用未来的完成执行程序并使用事件循环线程。
    猜你喜欢
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 2021-07-25
    • 2012-10-02
    • 2017-09-17
    • 2022-01-09
    相关资源
    最近更新 更多