Akka 提供了两种有些重叠的方式来管理actor状态,Finite State Machines和unbecome/become。它们各自的优点/缺点是什么?什么时候应该选择其中一个而不是另一个?
2 回答
FSM
是一种 DSL,它允许您构建比使用核心 Actor API更复杂、更易读的状态机。您可能会向业务人员展示 FSM 代码,他们可以验证业务规则。
FSM
DSL 允许您更干净地组合事物。例如,转换become
允许您分解必须在参与者行为之间复制的逻辑。您还可以订阅其他参与者以获取有助于解耦和测试的转换的通知。
计时器也很好地集成到 DSL 中,并且可以干净地处理取消之类的事情。使用调度程序编码超时消息有许多陷阱。
不利的一面FSM
是它是一种 DSL 和一种新的语法供其他团队成员消化。好的一面是它是一种 DSL 和更高级别的抽象。我认为agilesteel 的2 个状态阈值是一个很好的阈值。但是一旦你超过了 2 个状态,它的好处FSM
就非常引人注目。
一个注意事项:使用“弹出”行为unbecome
- 默认行为是不使用行为堆叠。它仅与少数用例相关(即,通常与状态机无关)。
与 FSM 相比,Become/Unbecome 非常轻量级。因此,除非您有超过 2 个状态(例如开/关)和/或复杂的状态更改策略,否则我不会将成为/取消成为完整的 FSM。除此之外,我认为只有微小的差异......例如,FSM 为您提供了一个很好的内置计时器 DSL:
setTimer("TimerName", msg, 5 seconds, repeat = true)
// ...
cancelTimer("TimerName")
或者例如,我不确定在 FSM 中是否可以“返回”到先前的状态,只有“前进”,因为您必须明确指定要进入哪个状态。而unbecome
正是给你的。