Project Reactor: реактивное программирование в Java
Нашел свою старую, анимешную, очень классную по дизайну, презу со времен работы в Райфе. Она мне так нравится, что я решил выложить сюда, не смотря на содержание доклада :^)
Что такое Reactor

Reactor Core — это имплементация спецификации Reactive Streams JVM и части ReactiveX-операторов. Сам jar не имеет отношения к Spring — это атомарная библиотека, которая базируется на двух классах: Mono и Flux.

Реактивное программирование — это программирование с асинхронными потоками данных. Шины событий, события нажатий на кнопки — всё это примеры асинхронных событийных потоков. Реактивность выжимает максимум из этой идеи: потоки можно создавать из чего угодно — переменных, пользовательского ввода, кеша, структур данных.
Зачем нужен Reactor, если есть RxJava

RxJava принадлежит коммерческой компании Netflix. Они завязаны на backward compatibility и вынуждены поддерживать Java 6 API, потому что 70% пользователей — Android-разработчики.
Reactor разработан Pivotal совместно с Java-сообществом. История: первая версия стримов работала быстро, но не соответствовала Reactive Streams манифесту. Вторая версия соответствовала, но провалилась. После экзистенциального кризиса и коллаборации с Cloud Foundry Java Client и Spring 5 — появился Reactor 3.

Проблемы с колбэками и Future
Два основных способа написать асинхронный код в Java:
- Callbacks — метод без возвращаемого значения, принимающий лямбду, которая вызывается после события. Плохо поддаются композиции, быстро превращаются в callback hell.
- Futures — объект, обещающий вернуть значение в будущем. Умеет блокироваться для ожидания результата, но этого недостаточно для сложных цепочек.
Пример: показать пользователю 5 топовых мемов, а если их нет — сходить в сервис предложений. Три сервиса, timeout 800 мс, fallback на кэш. В Reactor — просто цепочка операторов timeout и onErrorResume.
Flux и Mono
Flux — имплементация Publisher, последовательность из 0..N элементов. Три сигнала: onNext, onComplete, onError — все опциональны. Flux.interval() — бесконечная последовательность тиков.

Mono — имплементация Publisher, не более 1 элемента. Может быть пустым (Mono.empty()), использоваться как fire-and-forget задача (Mono<Void>). Если знакомы с RxJava — это коктейль из Single + Maybe.
