Можем ли мы иметь глобальное состояние в акторных системах?

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

С более практической точки зрения, что происходит с обновлениями объекта (например, БД) от нескольких участников в такой системе?


person Kislay Verma    schedule 02.03.2020    source источник
comment
Имейте в виду, что это относится не только к Akka, но и ко всем технологиям, основанным на акторных системах в целом.   -  person Milan Velebit    schedule 02.03.2020


Ответы (2)


Модель актора предназначена для решения проблемы с любым изменяемым общим состоянием другим способом - актор должен его инкапсулировать. Так что если вам нужно что-то разделить между акторами — это должен быть актор с этим состоянием и протокол для работы с ним. Если вы хотите обновлять БД от разных акторов — извлеките ответственного за это актора и предоставьте API или протокол для других акторов для обновления БД. Или создайте несколько акторов для обработки обновлений БД и маршрутизации сообщений между ними (подробнее см.: https://doc.akka.io/docs/akka/current/typed/routers.html)

Общий подход - подумайте об общем состоянии, поскольку актор разделяется между акторами (через ActorRef) и API состояния в виде сообщений для этого актора.

person Ivan Kurchenko    schedule 02.03.2020

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

Не передавайте изменяемые объекты между акторами. Чтобы гарантировать это, предпочитайте неизменяемые сообщения. Если инкапсуляция акторов нарушается путем раскрытия их изменяемого состояния наружу, вы возвращаетесь в обычную страну параллелизма Java со всеми недостатками.

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

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

Обычно операции чтения БД (CRUD) могут выполняться напрямую любым актором. Для этого. сделать ответственным за это актера, и использовать его от других акторов.

Дайте мне знать, если это поможет!!

person Anand Sai    schedule 02.03.2020