Подтвердить что ты не робот

FSM vs становится/небезопасным в Акке

Akka предоставляет два несколько совпадающих способа управления состояниями акторов, "Конечные машины" и unbecome/стать. Каковы их соответствующие преимущества/недостатки? Когда один из них выбирается над другим?

4b9b3361

Ответ 1

FSM - это DSL, который позволяет вам создавать более сложные, доступные для чтения государственные машины, чем это возможно, используя API-интерфейс основного актера. Вы могли бы потенциально показать код FSM деловому человеку, и они могли бы проверить бизнес-правила.

DSL FSM позволяет вам компоновать вещи более чисто. Например, transitions позволяет отбросить логику, которая должна дублироваться в действиях become. Также вы можете подписаться на других участников, чтобы получать уведомления о переходах, которые помогают с развязкой и тестированием.

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

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

Определенно читать документы FSM и сопровождающие примеры контрастирующие become и FSM.

Одна заметка re: "popping" поведение с использованием unbecome - поведение по умолчанию заключается в том, чтобы не использовать стекирование поведения. Это актуально только в небольшом количестве случаев использования (т.е. Обычно не государственных машин).

Ответ 2

Become/Unbecome очень легкие, в отличие от FSM. Поэтому, если у вас нет более двух состояний (например, вкл./Выкл.) И/или сложных политик изменения состояния, я бы не конвертировал Become/Unbecome в полнофункциональный FSM. Другое, тогда, я думаю, что есть только незначительные отличия... Например, например, FSM дают вам хороший встроенный таймер DSL:

setTimer("TimerName", msg, 5 seconds, repeat = true)
// ...
cancelTimer("TimerName")

Или, например, я не уверен, возможно ли в FSM "вернуться" к предыдущему состоянию, есть только "идти вперед", так как вам нужно явно указать, к какому состоянию нужно перейти. В то время как unbecome дает вам именно это.