Почему выгодно создавать асинхронные службы REST?

#spring #multithreading

#spring #многопоточность

Вопрос:

Spring позволяет методу с аннотацией @RequestMapping возвращать различные объекты, включая a CompletableFuture или a Future . Это позволяет мне запускать асинхронный метод и позволять spring возвращать значение всякий раз, когда оно будет готово. Я не уверен, что понимаю, есть ли в этом какие-либо преимущества. Например:

 @RestController
public class MyController {
    @RequestMapping("/user/{userId}")
    public CompletableFuture<User> getUser(@PathVariable("userId") String userId) {
        return CompletableFuture.supplyAsync(
              () -> this.dataAccess.getUser(userId));
}
  

В этом случае, даже если фактическое вычисление происходит в фоновом режиме, соединение все равно не будет закрыто, и поток запроса будет по-прежнему активен до его завершения. Чем это лучше, чем сказать:

 @RequestMapping("/user/{userId}")
public User getUser(@PathVariableS("userId") String userId) {
    return this.dataAccess.getUser(userId);
}
  

На первый взгляд, это кажется лучшим подходом, поскольку нет накладных расходов с дополнительным потоком и наблюдателем, который ищет завершение.

Ответ №1:

Это использует преимущества асинхронной обработки запросов Servlet 3, используя request.startAsync() метод. Читайте здесь и здесь

Для достижения этой цели веб-приложение Servlet 3 может вызвать request.startAsync() и использовать возвращенный AsyncContext для продолжения записи в ответ из какого-либо другого отдельного потока. В то же время с точки зрения клиента запрос по-прежнему выглядит как любое другое взаимодействие HTTP-запроса и ответа. Просто для завершения требуется больше времени. Ниже приведена последовательность событий: