我正在使用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)