Ответ
REST, построенный поверх HTTP/1.1, является синхронным, потому что клиентский запрос блокируется в ожидании ответа от сервера для каждого отдельного взаимодействия.
Ключевые характеристики синхронности REST:
- Модель «запрос-ответ» (Request-Response): Клиент отправляет HTTP-запрос и должен дождаться HTTP-ответа (или таймаута) прежде чем продолжить работу.
- Блокирующее соединение: В классической модели поток выполнения блокируется на время сетевого обмена.
- Отсутствие встроенного механизма 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).