使用 Java AsyncHttpClient(AHC) 库进行同步调用 -

问题描述

我有一个要求,我需要为每个请求使用不同的超时时间进行同步调用。下面是我现有的方法,其中我在所有请求中使用一个客户端实例。

//使用Sync HTTP客户端,它阻塞了两个线程,一个在post-call(执行线程),第二个线程在future.get(调用线程)

// 超时 —> 每个请求的自定义超时。

CompletableFuture<Response> modelFuture = CompletableFuture.supplyAsync(() -> {

    javax.ws.rs.core.Response response = jerseyResource.post(baseHttpRequestEntity); 

    return   response;

},executor);

score = modelFuture.get(timeout,TimeUnit.MILLISECONDS);

当使用如下所示的 AHC 替换上述代码时,使用 JMeter 对 1000 个请求进行 1 秒的加速测试时,我看到总体吞吐量更好,

ListenableFuture<Response> future = asyncHttpClient.preparePost(url).
setHeader("Content-Type","application/json").
setHeader("Content-Length","" + body.length()).
setBody(body).
setRequestTimeout((int)timeout).
execute();
Response response = future.get();

我知道第二种方法仍然是阻塞调用(在最后一行阻塞调用线程)并且只有当代码具有异步模式使用时才有用。但是更好的吞吐量的解释是,与我的第一种方法相比,它阻塞的线程更少。我的假设是第二个实现是利用 NIO 线程来更好地管理资源(Netty 的非阻塞 IO 操作)和为所有请求构建的单个计时器。在浏览文档时,我被困在下面的语句中,

这对调试很有用,但在生产环境中运行此类代码时,很可能会损害性能或产生错误。使用非阻塞客户端的要点是不要阻塞调用线程!

我上面关于更好性能的假设是否正确?

关于此声明损害性能或创建错误声明,我遗漏了什么?我无法弄清楚在我的第二个实现中会出现什么问题,从而产生错误

提前致谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)