Какова цель остановки актеров в Акке?

Я прочитал документацию Akka по отказоустойчивости и контролю, и я думаю их полностью понимаю, за одним большим исключением (без каламбура).

Почему вы вообще хотите/нужно останавливать ребенка-актера???

Единственная подсказка в документах:

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

Но для меня остановка дочернего элемента — это то же самое, что сказать «больше не выполнять этот код», что для меня фактически равноценно развертыванию новых изменений в код, в котором этот актер полностью удален:

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

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

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


person smeeb    schedule 13.01.2016    source источник
comment
Кто-то всегда проходит и отрицает мои вопросы Akka. Мне кажется, что кто-то из редакторской группы руководства пользователя Akka затаил на меня злобу, потому что я указываю области, в которых их документы нуждаются в улучшении! Этот вопрос относится к теме, не является обманом и является SSCCE. Почему минус?   -  person smeeb    schedule 13.01.2016
comment
Бакстер... это ты?!? По крайней мере, имейте смелость говорить!   -  person smeeb    schedule 13.01.2016
comment
Это определенно правильный вопрос, и я могу поручиться за команду Akka, что у нас нет причин или желания отклонять вопросы, которые указывают на упущения в наших документах. Но лучший способ их исправить — открыть тикеты на github, я наткнулся на это случайно.   -  person Roland Kuhn    schedule 14.01.2016


Ответы (3)


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

person Viktor Klang    schedule 13.01.2016
comment
Спасибо @Viktor Klang (+1) - это интересный ответ, и я могу решить вернуть зеленую галочку (извините, znurgl). Когда вы говорите иначе ребенок-актер останется активным/утечкой, что вы подразумеваете под утечкой? Я предполагаю, что мы хотим остановить дочернего актера, если у него нет никакой работы (иначе он просто потребляет ресурсы), но не уверен, что вы подразумеваете под утечкой, и я беспокоюсь, что есть что-то большое, относящееся к фреймворку, который я отсутствует здесь. Спасибо еще раз! - person smeeb; 13.01.2016
comment
Актеры живы, пока их не остановят, поэтому, если актеру больше нечем заняться, его нужно остановить. Актеры останавливаются либо вручную, либо при контроле, либо при остановке их родительского актера. - person Viktor Klang; 14.01.2016

Если дочерний актор выполняет более длительный процесс, который можно безопасно завершить, например кодирование видео или какое-либо преобразование файла, и вам необходимо развернуть новую сборку, в этом случае знак завершения будет полезен для корректной остановки запуска процессов.

person znurgl    schedule 13.01.2016
comment
Хорошо, я думаю понял. Я думаю, будет справедливо сказать, что Stop является своего рода особым случаем использования и не будет нормальной частью жизненного цикла обработки ошибок (имеется в виду, что вы обычно не останавливаете дочерний элемент внутри родительского процесса). SupervisorStrategy#Decider). - person smeeb; 13.01.2016

Каждый актор играет какую-то критическую роль в акторной системе.

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

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

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

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

person James Allan    schedule 21.11.2017