Akka предоставляет два несколько совпадающих способа управления состояниями акторов, "Конечные машины" и unbecome/стать. Каковы их соответствующие преимущества/недостатки? Когда один из них выбирается над другим?
FSM vs становится/небезопасным в Акке
Ответ 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
дает вам именно это.