Реактивные Актеры В Java

Существует множество технологий организации параллельных вычислений, одна из самых перспективных и простых (да) — модель акторов.

Он позволяет частично избавиться от насущных проблем параллелизма, таких как состояния гонки, блокировки ожидания окончания операций, бесконечные мьютексы и синхронизации и многое другое.

Этот подход также значительно облегчает распараллеливание кода.

Познакомимся на примере фреймворка акка с использованием языка Java (сама акка написана на Scala).



Теория и принципы

Актер — изолированный (нет прямых ссылок на экземпляр) объект, занимающийся асинхронной обработкой входящих сообщений.

Сообщение — это любой неизменяемый объект, реализующий интерфейс Serializable. Они хранятся в очереди, и когда система передает управление актору (подробнее об этом позже), объекты удаляются из очереди по принципу FIFO и обрабатываются по внутренней логике, которую мы должны явно определить.

Актеры образуют древовидную иерархию, создателем каждого из которых является актер (или система актеров).

Чтобы отправить сообщение актору, нужно иметь ссылку на него (не путать со ссылкой на объект).

Он бывает двух типов — ActorRef и ActorSelection. Ссылка имеет ключевой метод .

tell(message, sender), который отправляет сообщение по указанному пути.

Sender также является ссылкой типа ActorRef, которую актор-получатель получит при вызове метода getSender() при обработке сообщения.

АктерСсылка — ссылка на конкретного актора, существование которой гарантировано (на момент создания ссылки), аналог StrongReference. ActorRef можно получить явно, вызвав метод getSender() при обработке сообщений, получении прямой ссылки на отправителя или при создании дочерних акторов.

Чтобы гарантировать доставку сообщения, используется ответное сообщение или агент, подробнее об этом позже.

Выбор Актера — слабое звено, существенным отличием которого является возможность создать ActorSelection зная только имя и путь к актору, но обратная сторона медали — отсутствие гарантий, что по указанному пути хоть что-то существует. Вы можете отправить сообщение, но никто не гарантирует его доставку.

Поэтому, если вам нужно отправить данные с гарантией, но без прямой ссылки на нужный актер, ему отправляется произвольное сообщение, из ответа на которое можно взять сильную ссылку ActorRef. Собственно, это базовый минимум, после которого можно продолжить обучение на практике.

Подключаем библиотеки, их в стандартном пакете довольно много, чтобы избежать ручного разрешения зависимостей, проще подключить все сразу (или использовать maven/etc).



Немного практики

Асинхронный мир начинается с системы акторов, давайте создадим ее.

Обычно в приложении нет необходимости иметь более одной системы актеров.

  
   

ActorSystem system = ActorSystem.create("learning2hard");

Система имеет множество настроек, которые необходимо задать перед ее запуском (причем она активна сразу после создания).

Это настраивается во внешнем файле конфигурации или передается в качестве второго аргумента метода конструктора, о котором вы можете прочитать больше.

читай на сайте разработчик, нам это пока не нужно, просто стоит знать.

Теперь вам следует создать актора ядра, для которого вся будущая логика будет дочерней.

Технически актер — это объект, наследуемый от UntypedActor. Давай сделаем это.



public class Kernel extends UntypedActor {

Теги: #java #Akka #actor #actor model #Реактивное программирование #parallels #Высокая производительность #программирование #java

Вместе с данным постом часто просматривают: