状态机的理解与应用场景?
抱歉,这目前不是个分享而是个讨论
当前系统是Java 微服务架构,准备引入状态机,但是没有相关经验,也不确定是不是必须要引入
有几个问题想和大家交流:
- 状态机适合在什么业务场景和架构上使用
- 状态机解决什么问题
- 微服务场景适合状态机么
- 有没有参考的资料可以学习下
谢谢
抱歉,这目前不是个分享而是个讨论
当前系统是Java 微服务架构,准备引入状态机,但是没有相关经验,也不确定是不是必须要引入
有几个问题想和大家交流:
谢谢
1.有序的状态切换,这个有序是固定的、必经的,每个状态都要轮训一遍
例如上述订单流程
2.无序但有限几个状态之间无级切换,每次状态改变需要做固定接口的处理
例如有限个外观主题之间切换
我在一个 GUI 项目里面用了十多个状态机,处理一些独立的控件 event,这些控件不会和其他控件组合,一旦改变就会直接执行程序,这样只要控件的参数值有限,类型只有一个,多少个参数值就是多少个状态了
其实可以这样说,GUI 的控件都是固定的,程序就是处理控件产生的参数改变和组合而已,理论上可以全部用状态机写,理论上;只是有些参数值和类型太多,多个控件组合出来的状态可能无穷多,状态机无法全部列举而已
状态机是省代码和省思考,因为状态固定,状态进出处理的函数也固定(不太复杂),要想的就是状态变化的可能,穷举列出来而已
目前我所知的状态机处理第二种还是比较麻烦的,例如 3 种状态,要列明 1-2, 2-1, 1-3, 3-1, 2-3, 3-2 等所有排列组合情况,比较好的是如果这些 123 状态只是简单的标识区别,可以 for+排列组合 来完成这个定义,如果复杂一些就不好使了,还不如写个变参函数方便
顺便也举个不适用例子,也是这个 GUI 项目,最初想把语言切换(汉英)也写成状态机,后来考虑到将来要增加语言(日韩……),而且语言变化还有细微不同(状态不完全固定),感觉用状态机是给自己挖坑,就放弃了,改用事件信号+函数
纯在代码靠 if else 复杂度极高,维护过程新加角色、状态或者 几条操作路径都可能导致工作量爆炸
至于微服务和状态机的关系,这个其实没关系,更取决于业务复杂度
资料直接看工作流就可以