Я пытаюсь выяснить плюсы и минусы асинхронной и синхронной обработки HTTP-запросов. Я использую 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);
}
}
API синхронизации будет выполняться в рабочем потоке, поддерживаемом Jetty, а асинхронный API будет в основном работать в пуле таможенных потоков. И вот мой результат по Jmeter
-
Тест 1, рабочий поток 500 Jetty,/конечная точка синхронизации
-
Тест 2, 500 пользовательских потоков,/асинхронная конечная точка
Как показывает результат, между этими двумя подходами нет большой разницы.
Мой вопрос будет таким: каковы различия между этими двумя подходами и какой шаблон следует использовать в каком сценарии?
Связанная тема: Разница в производительности между синхронным обработчиком HTTP и асинхронным обработчиком HTTP
Обновить
Я запускаю тест с 10 задержками, как предложено
- синхронизация-500-сервер-нить
- Асинхры-500-WorkerThread