问题描述
我有一个要求,我需要为每个请求使用不同的超时时间进行同步调用。下面是我现有的方法,其中我在所有请求中使用一个客户端实例。
//使用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 (将#修改为@)