FSM vs在Akka成为/不成为

Tob*_*olm 20 fsm akka

Akka提供了两种有些重叠的方式来管理演员状态,有限状态机不成为/成为.它们各自的好处/缺点是什么?什么时候应该选择其中一个?

sou*_*ica 22

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

FSMDSL让你更清晰地撰写的东西放在一起.例如,转换允许您分解出必须在actor become行为中重复的逻辑.您还可以订阅其他演员以获得有关转换的通知,这有助于解耦和测试.

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

不利的一面FSM是它是DSL和其他团队成员消化的新语法.好的一面是它是DSL和更高级别的抽象.我认为agilesteel的2个州的门槛很好.但是,一旦你过了2个州,其好处就会FSM非常引人注目.

绝对阅读FSM文档随附的例子对比becomeFSM.

一个注释:使用"弹出"行为unbecome- 默认行为是不使用行为堆叠.它仅与少数用例相关(即通常不是状态机).


agi*_*eel 14

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

setTimer("TimerName", msg, 5 seconds, repeat = true)
// ...
cancelTimer("TimerName")
Run Code Online (Sandbox Code Playgroud)

或者例如,我不确定在FSM中是否可以"返回"前一个状态,只有"前进",因为您必须明确指定要去哪个状态.而恰恰相反unbecome.