Идея. Вместо «вызвать и ждать результат» — описать конвейер преобразований, который выполнится, когда придут данные. Поток не блокируется на ожидании сети или базы и обслуживает другие задачи.
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 дают похожую масштабируемость с простым кодом.