ФСМ против становления / неприбытия в Акке

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 дает вам именно это.

Другие вопросы по тегам