Java Basics: Reactive

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.
 Comments
Comment plugin failed to load
Loading comment plugin