Java Reactive
В стандарте Java не подразумевается реализация реактивности - в Java API присутствует лишь 4 интерфейса, которые организовывают пространство и приводят к стандарту реактивного программирования.
Flow.Subscription
- элемент, который реализует подписку;Flow.Publisher
- элемент, в задачи которого входит публикация сообщений в подписке. Фактически, он рассылает сообщения;Flow.Subscriber
- элемент, который “подписывается” на сообщения (оформляетFlow.Subscription
) от лица объекта типаFlow.Publisher
;Flow.Processor
- элемент опциональный, который может пропускать через себя сообщения, преобразовывать их и отправлять дальше фактическому получателю.
Реализовать реактивную программу можно и самостоятельно, но существует ряд фреймворков, которые уже это сделали:
- RxJava
- SpringReactor
- Vert.x
- Akka
Vert.x
Ключевым элементом для разработки является Verticle
. Verticle
запускает процесс (в цикле) ожидания сообщений, получаемых на вход (любых, будь то ответ от БД, сетевой ответ и т.д.).
Каждое событие, которое приходит в обработку должно гарантировать неблокирование потока - внутренний механизм Vert.x самостоятельно перемещает блокирующую операцию в отдельную область - тем самым сохраняя Verticle
неблокирующимся. Для этого используется физический поток (Thread
). По умолчанию допускается 2 процесса-цикла на CPU.
Verticle
может закрывать/открывать по требованию, для восстановления он может содержать соответствующие конфигурации. Если будет открыто несколько сущностей Verticle
(одинаковых), то сообщения между ними будут распределяться по стратегии round-robin, т.е. по-очереди.
EventBus
- основной механизм обмена сообщениями. Поддерживаются следующие способы коммуникации:
- P2P - получатель <- отправитель <- отправитель <- …;
- Запрос-ответ;
- PubSub.
При соответствующей настройки кластера, сообщения могут распределяться между несколькими JVM-процессы.
Так же может передавать сообщения по TCP или различными MQ приложениями.
Имеет встроенную реализацию механизма общения с тонкими клиентами посредством SockJS.
Verticle в Vert.x
Является интерфейсом, который реализует 4 метода:
getVertx
- фактически, возвращает контекст, в котором запускаетсяVerticle
;init
- вызывается внутри библиотеки. По окончании инициализации (после вызоваstart
);start
- запускаетVerticle
. ВозвращаетPromise
(в стартовых версияхFuture
), который делает метод асинхронным (например, ожидая ответ от какого-то внешнего ресурса). Важно чтоPromise<Void>
говорит о том что результат метода не ожидается - ожидается только асинхронный сигнал;stop
- останавливаетVerticle
.