Что такое reactive programming и backpressure?
- Что такое 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?
Разбор темы
- Reactive и Spring WebFlux
Неблокирующая модель и event loop, Reactive Streams и Reactor (Mono/Flux), backpressure, реактивный стек целиком, выбор MVC/WebFlux и цена сложности.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.