Mono Flux
Тема дорожной карты · Spring Boot
Mono и Flux — два основных типа издателей в Project Reactor, реактивной библиотеке, лежащей в основе Spring WebFlux и всей реактивной экосистемы Spring Boot. Mono<T> представляет асинхронную последовательность из нуля или одного элемента, являясь естественным возвращаемым типом для методов репозитория Spring Data, возвращающих единственную сущность, тогда как Flux<T> представляет последовательность от нуля до N элементов, подходящую для потоковых коллекций или непрерывных конвейеров данных. Оба типа реализуют спецификацию Reactive Streams и поддерживают богатую библиотеку операторов — map, flatMap, filter, zip, switchIfEmpty, — позволяющих компоновать неблокирующие трансформации без «ада обратных вызовов». В @RestController Spring WebFlux возврат Mono или Flux из метода-обработчика сигнализирует событийному циклу Netty о необходимости лениво подписаться и пропускать данные через конвейер с применением back-pressure, позволяя Spring Boot-приложениям обслуживать тысячи одновременных соединений при минимальном использовании потоков. Mono и Flux также интегрируются с R2DBC для реактивного доступа к реляционным базам данных, Spring Data Redis для неблокирующих операций с кэшем и реактивными консьюмерами Spring AMQP, формируя единую модель программирования в рамках полного реактивного стека Spring Boot.
Как это работает
Mono Flux: Spring WebFlux — non-blocking reactive стек на Project Reactor (типы Mono + Flux). Вместо one thread per request (Servlet), маленький thread pool handle-ит много concurrent запросов через event loop. R2DBC — reactive DB driver, аналог JDBC. WebClient (non-blocking, reactive HTTP-клиент) заменяет RestTemplate. Reactive код читается иначе: цепочки операторов (map, flatMap, filter) вместо imperative. Big learning curve, реальная польза только на high concurrency.
Когда применять
WebFlux только когда (а) huge fan-out + нужен backpressure, (б) streaming, (в) downstream reactive end-to-end. Смешение blocking JDBC в reactive-флоу убивает суть (offloading осторожно). Для типичного CRUD MVC + Servlet проще, debuggable, достаточно быстро. Virtual threads (JDK 21+) закрывают gap для многих случаев — рассмотрите до WebFlux.
Типичные ошибки
Ловушки Mono Flux: blocking calls внутри reactive-цепочек (убивает модель + deadlocks); reactive везде "потому что быстрее" (медленнее для wrong shape работы); сложнее debugging (stack traces бесполезны; checkpoint() + reactor debug agent); over-use flatMap, когда map работает.