Akka提供两种有些重叠的方式来管理演员状态,Finite State Machines和unbecome/become。它们各自的好处/缺点是什么?什么时候应该选择其中一个?
答案 0 :(得分:22)
FSM
是一种DSL,它允许您构建比使用核心actor API更复杂的可读状态机。您可以向业务人员显示FSM代码,他们可以验证业务规则。
FSM
DSL允许您更干净地组合在一起。例如,transitions允许您分解出必须在actor become
行为中重复的逻辑。此外,您还可以订阅其他演员以获得有关转换的通知,这有助于解耦和测试。
此外,定时器可以很好地集成到DSL中,并且可以干净地处理取消等操作。使用调度程序编码超时消息有许多问题。
FSM
的缺点是它是DSL和其他团队成员消化的新语法。好的一面是它是DSL和更高级别的抽象。我认为agilesteel的2个州的门槛很好。但是,一旦你过了2个州,FSM
的好处真的很有吸引力。
绝对阅读the FSM docs和accompanying examples对比become
和FSM
。
重要提示:使用unbecome
“弹出”行为 - 默认行为是不使用行为堆叠。它仅与少数用例相关(即通常不是状态机)。
答案 1 :(得分:14)
与FSM相比,成为/不成为非常轻量级。因此,除非您有超过2个状态(例如开/关)和/或复杂的状态更改策略,否则我不会将“成为/不成功”转换为完整的FSM。除此之外,我认为只有微小的差异......比如FSMs给你一个不错的内置定时器DSL:
setTimer("TimerName", msg, 5 seconds, repeat = true)
// ...
cancelTimer("TimerName")
或者例如我不确定在FSM中是否可以“返回”前一个状态,只有“前进”,因为你必须明确指定要去哪个状态。而unbecome
正好给你。