有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态(State)以及在这些状态之间的转移(Transition)和动做(Action)等行为的数学模型。git
状态机有三个特征:github
从有限状态机的定义和特征咱们能够看到它的几个重要概念:正则表达式
因为有限状态机的这些特征,咱们能够把状态转移的过程作成相似这样的状态转移表。spring
条件\当前状态 | 状态A | 状态B | 状态C | 状态D |
---|---|---|---|---|
条件X | 状态B | 状态C | 状态D | ... |
条件Y | 状态C | 状态D | ... | ... |
条件Z | ... | 状态A | 状态A | 状态A |
能够概括为一个公式。
Old State + Event = New State编程
把上面的状态转移表用公式表达就是
状态A + 条件X = 状态B
状态A + 条件Y = 状态C
...restful
咱们小时候都应该玩过贪吃蛇这个游戏,游戏规则没必要再说,咱们看看使用有限状态机来实现这个游戏。网络
状态转移表:微服务
条件\当前状态 | GAME_OVER | UP | DOWN | LEFT | RIGHT |
---|---|---|---|---|---|
EAT | ... | UP | DOWN | LEFT | RIGHT |
HIT | ... | GAME_OVER | GAME_OVER | GAME_OVER | GAME_OVER |
TURN_UP | UP | ... | ... | UP | UP |
TURN_DOWN | DOWN | ... | ... | DOWN | DOWN |
TURN_LEFT | LEFT | LEFT | LEFT | ... | ... |
TURN_RIGHT | RIGHT | RIGHT | RIGHT | ... | ... |
EAT:吃掉食物
HIT:撞墙或本身
TURN_UP:向上转向事件
...
GAME_OVER: 为了简便一点,咱们让它既是开始又是结束的状态,当按下上下左右任一键时开始游戏。
UP: 向上前进状态,此时能够吃掉食物,也能够撞到墙或本身,同时能够向左向右转向,但按下向上或向下是不会触发任何动做。
...ui
当咱们把状态转移表定义好以后就会发现这个游戏剩下的部分很是好写,并且逻辑很是清楚,这就是有限状态机的好处。编码
笔者目前所在的部门是正在使用OpenStack作电子网络靶场的一个项目,必然少不了对虚拟机各项指标的采集,所以对采集进行监控也是必要的措施,以便在采集故障以后及时预警。
整个监控流程是由客户端(Java微服务)往Kafka中发一条采集配置,采集端(Python)收到这条配置后进行解析配置,而后进行指标采集,同时往Kafka回传一些运行信息,当想要中止采集时须要客户端再次下发一条关闭配置,采集端进行执行并回传至Kafka关闭信息。
看似这个过程十分简单,像把大象装进冰箱同样简单。
使用有限状态机来作其中的状态转移时真的就像是把大象塞进冰箱同样简单(其中使用restful接口接收客户端的开始关闭配置,监听kafka指定topic来处理采集端消息)。
条件\当前状态 | Idle | processing | wait_close | exception | timeout | closed |
---|---|---|---|---|---|---|
start_conf | ||||||
error_conf | closed | |||||
pro_start | processing | |||||
heartbeat | processing | processing | ||||
error_runtime | exception | |||||
stop_conf | wait_close | wait_close | wait_close | |||
pro_stop | closed | closed | closed | |||
msg_timeout | timeout | timeout | timeout | timeout | ||
fix | closed |
事件
状态
笔者这里使用的库是squirrel-foundation,支持多实例状态机而且和spring进行整合也比较简单。
有限状态机能使咱们从复杂的状态转移判断中脱离出来,专心业务逻辑,而且避免状态转移过程的判断错误,是一种很强大的模型。