Project Reactor: реактивное программирование в Java

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

Презентация (OneDrive)


Что такое Reactor

Reactive Streams JVM

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

Java 9 Flow API

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

Зачем нужен Reactor, если есть RxJava

Why users want Reactor?

RxJava принадлежит коммерческой компании Netflix. Они завязаны на backward compatibility и вынуждены поддерживать Java 6 API, потому что 70% пользователей — Android-разработчики.

Reactor разработан Pivotal совместно с Java-сообществом. История: первая версия стримов работала быстро, но не соответствовала Reactive Streams манифесту. Вторая версия соответствовала, но провалилась. После экзистенциального кризиса и коллаборации с Cloud Foundry Java Client и Spring 5 — появился Reactor 3.

Бенчмарк: Reactor vs RxJava vs Java Streams

Проблемы с колбэками и Future

Два основных способа написать асинхронный код в Java:

  • Callbacks — метод без возвращаемого значения, принимающий лямбду, которая вызывается после события. Плохо поддаются композиции, быстро превращаются в callback hell.
  • Futures — объект, обещающий вернуть значение в будущем. Умеет блокироваться для ожидания результата, но этого недостаточно для сложных цепочек.

Пример: показать пользователю 5 топовых мемов, а если их нет — сходить в сервис предложений. Три сервиса, timeout 800 мс, fallback на кэш. В Reactor — просто цепочка операторов timeout и onErrorResume.

Flux и Mono

Flux — имплементация Publisher, последовательность из 0..N элементов. Три сигнала: onNext, onComplete, onError — все опциональны. Flux.interval() — бесконечная последовательность тиков.

Flux diagram

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

Mono diagram

Ссылки