【发布时间】:2019-09-15 16:52:36
【问题描述】:
我试图弄清楚异步和同步 HTTP 请求处理的优缺点。我正在使用带有 Jersey 的 Dropwizard 作为我的框架。 测试是比较异步和同步HTTP请求处理,这是我的代码
@Path("/")
public class RootResource {
ExecutorService executor;
public RootResource(int threadPoolSize){
executor = Executors.newFixedThreadPool(threadPoolSize);
}
@GET
@Path("/sync")
public String sayHello() throws InterruptedException {
TimeUnit.SECONDS.sleep(1L);
return "ok";
}
@GET
@Path("/async")
public void sayHelloAsync(@Suspended final AsyncResponse asyncResponse) throws Exception {
executor.submit(() -> {
try {
doSomeBusiness();
asyncResponse.resume("ok");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
private void doSomeBusiness() throws InterruptedException {
TimeUnit.SECONDS.sleep(1L);
}
}
sync API 将运行在 Jetty 维护的工作线程中,async API 将主要运行在自定义线程池中。这是我的 Jmeter 结果
我的问题是:这两种方法有什么区别,在哪种情况下我应该使用哪种模式?
相关话题:Performance difference between Synchronous HTTP Handler and Asynchronous HTTP Handler
更新
我按照建议延迟了 10 次运行测试
- sync-500-server-thread
- async-500-workerthread
【问题讨论】:
-
[1] 在“/async”摘要报告中,min 值 7(毫秒?)看起来非常低。如果您重复运行,报告是否仍然显示 min 的类似低值? [2] 您可能需要考虑将其中一个标签替换为 jmeter 以吸引更合适的受众。
-
您是否尝试过延迟 10 秒进行复制?
-
@skomisa 这是因为我在运行异步测试时出现了一些套接字错误,如您所见,错误率为 1.08%
-
@user7294900 我以 10 秒的延迟重新运行测试用例,实际上,异步方式在最大延迟方面稍差一些,我认为这是因为这里有更多的上下文切换
标签: java multithreading http asynchronous jmeter