FSM vs在Akka成为/不成为

时间:2013-06-14 13:49:07

标签: akka fsm

Akka提供两种有些重叠的方式来管理演员状态,Finite State Machinesunbecome/become。它们各自的好处/缺点是什么?什么时候应该选择其中一个?

2 个答案:

答案 0 :(得分:22)

FSM是一种DSL,它允许您构建比使用核心actor API更复杂的可读状态机。您可以向业务人员显示FSM代码,他们可以验证业务规则。

FSM DSL允许您更干净地组合在一起。例如,transitions允许您分解出必须在actor become行为中重复的逻辑。此外,您还可以订阅其他演员以获得有关转换的通知,这有助于解耦和测试。

此外,定时器可以很好地集成到DSL中,并且可以干净地处理取消等操作。使用调度程序编码超时消息有许多问题。

FSM的缺点是它是DSL和其他团队成员消化的新语法。好的一面是它是DSL和更高级别的抽象。我认为agilesteel的2个州的门槛很好。但是,一旦你过了2个州,FSM的好处真的很有吸引力。

绝对阅读the FSM docsaccompanying examples对比becomeFSM

重要提示:使用unbecome“弹出”行为 - 默认行为是不使用行为堆叠。它仅与少数用例相关(即通常不是状态机)。

答案 1 :(得分:14)

与FSM相比,成为/不成为非常轻量级。因此,除非您有超过2个状态(例如开/关)和/或复杂的状态更改策略,否则我不会将“成为/不成功”转换为完整的FSM。除此之外,我认为只有微小的差异......比如FSMs给你一个不错的内置定时器DSL:

setTimer("TimerName", msg, 5 seconds, repeat = true)
// ...
cancelTimer("TimerName")

或者例如我不确定在FSM中是否可以“返回”前一个状态,只有“前进”,因为你必须明确指定要去哪个状态。而unbecome正好给你。