Mono<T> — publisher phát 0 hoặc 1 phần tử (như Optional async).Flux<T> — publisher phát 0..N phần tử (như Stream async, có thể vô tận).
Cả 2 lazy — chỉ chạy khi có subscriber.
java
Mono<User> findById(Long id) { return userRepo.findById(id); }
Flux<Order> recent() {
return orderRepo.findAllByDateAfter(yesterday())
.filter(o -> o.getTotal().compareTo(BigDecimal.TEN) > 0)
.map(this::enrich);
}Backpressure: consumer báo producer "chỉ nhận X item/giây" → tránh OOM khi producer nhanh hơn consumer:
java
Flux.fromStream(bigDbStream)
.onBackpressureBuffer(1000) // hoặc onBackpressureDrop()
.subscribe(this::process);Operator chính: map, flatMap, filter, zip, merge, retry. Lưu ý 2026: có Virtual Threads (Java 21), MVC + blocking đã đủ concurrency — chỉ dùng WebFlux khi thật sự cần backpressure/streaming.