Когда следует применять синхронное API?

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

Ответ

Синхронное (блокирующее) API следует применять, когда приоритетом являются простота разработки, чтения кода и отладки, а требования к масштабируемости умеренные.

✅ Основные сценарии:

  1. Простота и читаемость кода – в небольших приложениях, скриптах или сервисах с низкой нагрузкой, где сложность асинхронности не оправдана. Последовательный код легче понимать и поддерживать.
  2. Строгая последовательность операций – когда каждая следующая операция критически зависит от результата предыдущей, и параллельное выполнение невозможно или бессмысленно.
  3. Клиентские приложения или CLI-утилиты – где нет необходимости обрабатывать множество конкурентных запросов, а основная задача — выполнить чёткую последовательность действий.

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

// Прямой и понятный код
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://api.example.com/data"))
        .build();

// Поток блокируется здесь до получения ответа
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

// Дальнейшая обработка происходит только после получения ответа
System.out.println("Status: " + response.statusCode());
System.out.println("Body: " + response.body());

⚖️ Когда синхронный подход становится проблемой:

  • Высокая конкурентная нагрузка – каждый блокирующий вызов "связывает" поток, что быстро исчерпывает пул потоков (например, в веб-сервере).
  • Долгие I/O-операции – если операция занимает секунды, поток всё это время простаивает в ожидании.

Вывод: Используйте синхронное API по умолчанию для простоты и переходите к асинхронному только при явной необходимости, подтверждённой нагрузочным тестированием.