Akka有限状态机和如何协议行为,未处理?

wj8zmpe1  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(179)

我有一个关于Behaviors.unhandled的问题,我知道Akka会将未处理的消息发送到Dead Letter,并且使用以下配置,它还会记录该消息

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

这在以下问题Behaviours.unhandled中有争议,并针对Akka的典型工作方式进行了论证,这是可接受的,也应仅记录在调试级别。
在这一点上,我的但是来,有限状态机是另一个层次上Akka和在有限状态机的概念,这种情况涉及到未设计的处理转移,并作为问题的原始海报声称是一个bug,这是真正重要的迭代方法设计有限状态机.
对于Akka FSM,典型的FSM配置将类似于以下内容:

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

    case _ => Behaviors.unhandled
  }
}

现在,如果用户在NEW状态期间设法产生onUserDoubleClicked(payload)事件,则这是我们方面设计错误,这令我们感到惊讶。
问题是,我们大多数人不会在生产环境中以调试级别运行应用程序,如果我们在生产环境中遇到未处理的转换,我们将永远不会发现这一点,并在下一次迭代中修复。
为了能够跟踪这一点,我们必须订阅死信并没有传递在所有的FSM概念。
出于这个原因,我认为即使这种情况是可以接受的正常Akka,与有限状态机的概念,这种情况必须记录至少在警告级别或配置选项必须提供配置的行为,或您看到任何其他方式来实现这一点,而没有巨大的代码混乱?

8ulbf1ek

8ulbf1ek1#

我不确定这是否是您问题的最准确答案,但我将分享我们在此使用案例中取得的成功。
看看这个:https://github.com/bilal-fazlani/fsm-with-akka-typed
我们尝试使用akka类型为FSM提取一个模式。此模式的关键是一个自定义接收函数,即myReceive。
这不仅允许我们自己在任何级别记录未处理的消息,而且还允许向发送者发送一个回复,告知他们的消息是未处理的。这种模式的另一个好处是--由于我们创建了单独的消息层次结构,如ReadBehaviorMessageWriteBehaviorMessage,我们现在被迫处理所有“特定状态”的消息;否则编译器会显示警告。

8zzbczxx

8zzbczxx2#

有了前面答案中给出的提示和我自己的想法,使用AspectJ来识别代码达到“未处理”行为的地方,我开发了一个Aspect,它可以捕获Akka有限状态机中的未处理事件,这有助于识别迭代方法中缺少的设计元素和错误。
您可以在我的blog中找到实现细节,它解释了AspectJ如何在Scala状态机中提供帮助。
它捕获调用未处理的时刻,并帮助识别处于哪个状态、达到未处理的转换、事件有效负载是什么以及在此状态下保存的信息快照。

相关问题