我有一个关于 Behaviors.unhandled 的问题,我知道 Akka 将未处理的消息发送到死信,并且使用以下配置它也会记录它
akka {
loglevel = "DEBUG"
actor {
debug {
# enable DEBUG logging of unhandled messages
unhandled = on
}
}
}
这在以下问题之前有争议Behaviours.unhandled并争论了 Akka 工作的典型方式,这是可以接受的,也应该只在 DEBUG 级别登录。
在这一点上,我的但来了,有限状态机是 Akka 的另一层,在有限状态机概念中,这种情况与未设计的处理转换有关,正如问题的原始海报所声称的那样,这是一个在迭代方法中非常重要的错误设计有限状态机。
对于 Akka FSM,典型的 FSM 配置将如下所示,
private val NEW: Behavior[Event] = {
Behaviors.receive {
case (ctx, onUserClicked(payload)) =>
//doSomething()
case _ => Behaviors.unhandled
}
}
现在,如果令我们惊讶的是,如果用户设法在 NEW 状态期间生成 onUserDoubleClicked(payload) 事件,那么这是我们这边的设计错误。
问题是,我们大多数人不会在生产环境中以 DEBUG 级别运行我们的应用程序,如果我们在生产环境中遇到未处理的转换,我们将永远不会发现这一点并在下一次迭代中修复。
为了能够跟踪这一点,我们必须订阅 Dead Letters 根本不会传递给 FSM 概念......
出于这个原因,我认为即使这种情况对于普通 Akka 也是可以接受的,对于有限状态机概念,这种情况必须至少在 WARN 级别记录,或者必须提供配置选项来配置行为,或者您是否看到任何其他方式来实现这没有大量的代码混乱?