Akka Finite State Machine и как протоколировать поведение. - PullRequest
0 голосов
/ 14 января 2020

У меня есть вопрос о Behaviors.unhandled, я знаю, что Akka отправляет необработанное сообщение в «Мёртвое письмо», и в следующей конфигурации оно также записывает его в журнал

akka {
 loglevel = "DEBUG"
 actor {
   debug {
    # enable DEBUG logging of unhandled messages
   unhandled = on
   }
  }
}

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

На данный момент, но это происходит, Finite State Machine - это еще один слой над В Akka и в концепциях конечного автомата эта ситуация связана с незапланированным переходом, и, как утверждает Оригинальный постер проблемы, это ошибка, которая действительно важна в итеративном подходе к проектированию конечных автоматов.

Типичный FSM Конфигурация будет выглядеть следующим образом для Akka FSM,

private val NEW: Behavior[Event] = {
  Behaviors.receive {
    case (ctx, onUserClicked(payload)) =>
      //doSomething()

    case _ => Behaviors.unhandled
  }
}

сейчас, если, к нашему удивлению, если пользователю удастся произвести во время NEW State событие onUserDoubleClicked (payload), то это ошибка проектирования на нашей стороне.

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

Чтобы отслеживать это, мы должны подписаться на Dead Letters. вообще не переходить к понятиям FSM ....

По этой причине я думаю, что даже эта ситуация является приемлемой для обычного Akka, с концепциями конечного автомата эта ситуация должна регистрироваться, по крайней мере, на уровне WARN или в конфигурации должна быть предоставлена ​​опция для настройки поведения, или вы видите какой-либо другой способ добиться этого без огромного беспорядка кода?

1 Ответ

0 голосов
/ 14 января 2020

Я не уверен, что это самый точный ответ на ваш вопрос, но я поделюсь тем, что сработало для нас в этом случае.

Проверьте это: https://github.com/bilal-fazlani/fsm-with-akka-typed

Мы попытались извлечь шаблон для FSM, используя akka typed. Ключом к этому шаблону является пользовательская функция приема, т.е. myReceive .

Это позволяет не только самостоятельно регистрировать необработанные сообщения на любом уровне, но и отправлять ответ отправителю, что их сообщение было необработанным. , Другое преимущество этого шаблона - поскольку мы создали отдельные иерархии сообщений, такие как ReadBehaviorMessage и WriteBehaviorMessage, теперь мы вынуждены обрабатывать все сообщения «определенного состояния»; в противном случае компиляторы выдают предупреждение.

...