Почему REST API считается синхронным по своей природе?

«Почему REST API считается синхронным по своей природе?» — вопрос из категории Сети, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

REST, построенный поверх HTTP/1.1, является синхронным, потому что клиентский запрос блокируется в ожидании ответа от сервера для каждого отдельного взаимодействия.

Ключевые характеристики синхронности REST:

  1. Модель «запрос-ответ» (Request-Response): Клиент отправляет HTTP-запрос и должен дождаться HTTP-ответа (или таймаута) прежде чем продолжить работу.
  2. Блокирующее соединение: В классической модели поток выполнения блокируется на время сетевого обмена.
  3. Отсутствие встроенного механизма push-уведомлений: Сервер не может инициировать отправку данных клиенту. Для эмуляции асинхронности используются поллинг (polling) или длинные запросы (long-polling), которые сами по себе являются серией синхронных вызовов.

Пример синхронного REST-вызова:

// Синхронный клиент (например, с использованием Spring RestTemplate)
ResponseEntity<User> response = restTemplate.getForEntity("https://api.example.com/users/123", User.class);
User user = response.getBody(); // Код выполняется только после получения полного ответа
System.out.println(user.getName());

Асинхронные альтернативы и расширения:

  • Асинхронные клиенты: Можно использовать реактивные клиенты (WebClient в Spring, AsyncHttpClient), которые не блокируют поток, но протокол HTTP остаётся синхронным.
  • WebHooks/Callbacks: Сервер отвечает немедленно (202 Accepted), а результат доставляется позже на callback URL клиента.
  • Другие протоколы: Для истинно асинхронного двустороннего обмена используются WebSockets, gRPC-стримы или message brokers (Kafka, RabbitMQ).