【问题标题】:Perform Async Connect with Java AsyncHttpClient Library?使用 Java AsyncHttpClient 库执行异步连接?
【发布时间】:2011-08-12 13:44:47
【问题描述】:

我只是将一些代码从 .net 移植到 Java。我一直在使用 AsyncHttpClient (https://github.com/sonatype/async-http-client) 库和 Netty 提供程序。

做了一些测试,我惊讶地发现在执行调用期间,例如:

httpClient.prepareGet("http://bbc.co.uk").execute(
                  new AsyncCompletionHandler<Response>() { ... });

NettyAsyncHttpProvider 执行引导连接到站点,即:

bootstrap.connect(new InetSocketAddress(
                                        AsyncHttpProviderUtils.getHost(uri), 
                                        AsyncHttpProviderUtils.getPort(uri)));

编辑:澄清 NettyAsyncHttpProvider 类是 AsyncHttpClient 库的一部分。它与 Netty 本身无关。

这意味着在 bbc 网站(在我的低连接上)执行完成大约需要 300 毫秒(然后异步接收/完成几乎立即发生)。这真的会破坏我试图启动多个异步调用的调度程序的性能。当每次调用都针对同一个域时,它运行良好。在我的情况下,我有数百个不同的域,因此每次调用都会在建立连接时产生初始延迟,这会降低调度程序的吞吐量。

谁能就如何使用这个库提供任何建议,使其真正以异步方式或替代库工作?

谢谢, 保罗

【问题讨论】:

    标签: java http asynchronous


    【解决方案1】:

    为了回答我自己的问题...最后我尝试了原始的 AsyncHttpClient 库、Jetty 和 Apache HttpAsyncClient (http://hc.apache.org/httpcomponents-asyncclient-dev/index.html) 来尝试找到一个 100% 异步的库。

    据我所知,这些库中的每一个都会在异步执行实际的 http 请求之前执行阻塞连接。

    为了继续前进,我已经在自己的线程中执行每个 http 请求。我遵循了“2.9. 多线程请求执行”(http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html) 部分中概述的模式,该模式详细说明了如何使用这种方法。

    这种方法现在运行良好,允许我的“调度程序”快速创建大量异步调用,而不会在主线程中出现任何阻塞。

    【讨论】:

    • 这仍然是最好的解决方案吗?异步库的大部分目的是避免产生多个线程。这种变通方法违背了它的目的。
    【解决方案2】:

    是的,你看过java非阻塞api吗? (又名 NIO)? 有一个关于它的stack overflow thread 很有用。 另外这个article by IBM developerWorks 应该可以帮助您确定它是否是您需要的。

    【讨论】:

    • 嗨 Ali,我的印象是这些库已经在使用 NIO。
    • 不确定 Netty,但 Grizzly 在其网站上明确表示它使用 NIO。
    • 是的,Netty 也是。不过,Netty 中并没有发生同步调用。它发生在 AsyncHttpClient 库中。我正在更新问题以澄清这一点。
    • 我的搜索还在继续。我已经在 J​​etty 中尝试过 HttpClient,它的作用完全相同。出于某种原因,在调用线程中执行 socket.connect 似乎是 java 模式。我是 Java 新手,所以我不想说它从根本上是错误的......但是。现在,我将为每个调用创建一个线程,并在每个工作线程中执行一个同步 http 调用。违规的码头代码在第 100 行 link
    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2016-08-24
    相关资源
    最近更新 更多