RestEasy Async Client阻止网络呼叫

时间:2018-07-15 06:14:58

标签: asynchronous jax-rs resteasy jersey-client

我正在使用JAX-RS异步客户端来调用另一个Web服务。

我的观察是异步客户端正在将请求(网络调用)提交给ExecutorService,该服务的线程在网络调用中被阻塞。

由于网络调用是同步的,因此我可以实现的最大并行度等于ExecutorService中的线程数。

这违背了进行异步设计的目的。阻塞I / O将导致更多线程上下文切换,这将增加CPU使用率。因此,这与进行多线程设计一样好。 (请参阅Is non-blocking I/O really faster than multi-threaded blocking I/O? How?

解决此问题对我的服务很重要,因为CPU利用率越来越高(70-80%),而且我无法在不影响延迟的情况下获得更多的tps。

客户建设:

final ResteasyClient client = new ResteasyClientBuilder().withConfig(clientConfig)
                                                            .asyncExecutor(Executors.newFixedThreadPool(nThreads))
                                                            .build();

呼叫其他服务:

client.target(url).request().async().post(entity, callback);

RestEasyClient的版本为3.0.10(https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-client/3.0.10.Final

0 个答案:

没有答案