ФСМ против становления / неприбытия в Акке
Akka предоставляет два частично совпадающих способа управления состояниями актеров: конечные автоматы и непроявление / становление. Каковы их соответствующие преимущества / недостатки? Когда один из них должен быть выбран другим?
2 ответа
FSM
представляет собой DSL, который позволяет создавать более сложные, удобочитаемые конечные автоматы, чем это было бы возможно при использовании API основного субъекта. Вы могли бы потенциально показать код FSM деловому человеку, и он мог бы проверить бизнес-правила.
FSM
DSL позволяет составлять вещи более аккуратно. Например, переходы позволяют вычленить логику, которая должна дублироваться на актера become
поведения. Также вы можете подписаться на других актеров, чтобы получать уведомления о переходах, что помогает в разделении и тестировании.
Также таймеры хорошо интегрированы в DSL, и такие вещи, как отмена, обрабатываются аккуратно. Кодирование сообщений о тайм-ауте с использованием планировщика имеет ряд ошибок.
Обратная сторона FSM
является то, что это DSL и новый синтаксис для других членов команды, чтобы переварить. Положительным моментом является то, что это DSL и намного более высокий уровень абстракции. Я думаю, что порог agilesteel в 2 состояния является хорошим. Но как только вы пройдете 2 состояния, вы получите FSM
действительно неотразимы.
Обязательно ознакомьтесь с документами FSM и сопровождающими их примерами. become
а также FSM
,
Одно замечание: "высовывать" поведение, используя unbecome
- поведение по умолчанию - не использовать укладку поведения. Это актуально только в небольшом числе случаев использования (т. Е. Обычно не в конечных автоматах).
Become/Unbecome очень легкие в отличие от FSM. Поэтому, если у вас нет более 2-х состояний (например, вкл / выкл) и / или сложных политик изменения состояний, я бы не стал конвертировать Become/Unbecome в полноценный FSM. Кроме этого, я думаю, что есть только незначительные различия... Как, например, FSMs дают вам хороший встроенный таймер DSL:
setTimer("TimerName", msg, 5 seconds, repeat = true)
// ...
cancelTimer("TimerName")
Или, например, я не уверен, что в FSM возможно "вернуться" к предыдущему состоянию, есть только "идти вперед", так как вы должны явно указать, в какое состояние переходить. В то время как unbecome
дает вам именно это.