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.