Вопрос с собеседования · Spring

Что такое reactive programming и backpressure?

SeniorReactive и WebFluxWebFlux
Ещё спрашивают так:
  • Что такое Reactive Streams?
Коротко

Реактивное программирование — работа с асинхронными потоками данных через неблокирующие операторы. Backpressure — потребитель сам запрашивает столько элементов, сколько готов обработать (request(n)), и быстрый источник его не захлёстывает.

  • Reactive Streams: Publisher, Subscriber, Subscription, Processor (в Java 9 — Flow)
  • Project Reactor: Mono (0–1), Flux (0–N)
  • Без подписки ничего не происходит — цепочка ленивая

А ещё Цена: сложнее код, отладка и стектрейсы

Подробно

Идея. Вместо «вызвать и ждать результат» — описать конвейер преобразований, который выполнится, когда придут данные. Поток не блокируется на ожидании сети или базы и обслуживает другие задачи.

Reactive Streams — стандарт из четырёх интерфейсов: Publisher, Subscriber, Subscription (request(n), cancel()), Processor. В Java 9 вошёл как java.util.concurrent.Flow. Реализации: Project Reactor (Spring), RxJava.

Backpressure: подписчик говорит, сколько элементов готов принять, и издатель не отправит больше. Это защищает от переполнения памяти. Если источник не может замедлиться (события пользователей), выбирают стратегию: ограниченный буфер, отбрасывание, только последнее значение (onBackpressureBuffer, onBackpressureDrop, onBackpressureLatest).

Reactor: Mono<T> — 0 или 1 элемент, Flux<T> — поток. Операторы map, flatMap (асинхронный шаг), filter, zip, timeout, retry. Без subscribe (или возврата наружу, где подпишется фреймворк) ничего не выполнится.

Когда оправдано: много одновременных соединений с ожиданием (шлюзы, стриминг, SSE, WebSocket), потоковая обработка. Для обычного CRUD цена в сложности кода часто выше выгоды, а виртуальные потоки Java 21 дают похожую масштабируемость с простым кодом.

Что хотят услышать

  • Суть реактивного подхода.
  • Интерфейсы Reactive Streams и request(n).
  • Backpressure и стратегии.
  • Mono, Flux, ленивость, когда применять.

Частые ошибки

  • Ожидать выполнения цепочки без подписки.
  • Считать реактивность автоматически «быстрее».

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Многопоточная обработка, где каждый запрос получает свой поток
  • ✗Буферизация всех входящих элементов без ограничений
  • ✗Подход, при котором источник отправляет данные так быстро, как может, а лишнее отбрасывается брокером
  • ✓Неблокирующие потоки данных; потребитель сам запрашивает request(n), сколько готов обработать

Что спросят дальше

  • Чем Mono отличается от Flux?
  • Что такое hot и cold publisher?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования