状态机的理解与应用场景?

2020-09-22 13:06:17 +08:00
 beryl

抱歉,这目前不是个分享而是个讨论

当前系统是Java 微服务架构,准备引入状态机,但是没有相关经验,也不确定是不是必须要引入

有几个问题想和大家交流:

  1. 状态机适合在什么业务场景和架构上使用
  2. 状态机解决什么问题
  3. 微服务场景适合状态机么
  4. 有没有参考的资料可以学习下

谢谢

5485 次点击
所在节点    程序员
32 条回复
opengps
2020-09-22 13:12:17 +08:00
状态机解决的是站点集群共享会话问题,在集群环境下,多个 web 负载机(无状态)可以更好地使用弹性伸缩,零活增加 web 机器数量来增加负载,但是对于会话状态,则需要:A 定向到某台机器 或者 B 共享到一个地方
解析:
A 定向到某台机器的做法,在负载均衡处可使用“改写 cookie”
B 共享会话状态,则统一从“状态服务器”获取。也就是你说的状态机
zoharSoul
2020-09-22 13:33:00 +08:00
比如交易订单状态流转
beryl
2020-09-22 13:53:37 +08:00
@zoharSoul  查了一些资料,也大都是运用在交易系统,我们目前不是这种系统,而且有多种实体,流程状态可能也要比交易要复杂
beryl
2020-09-22 13:54:28 +08:00
@opengps 如果按照这种理解,感觉当前系统不适合。我再研究研究
reus
2020-09-22 13:58:51 +08:00
能不能不要乱用名词?
状态机就是状态机,你这个叫状态服务器!
不要用不同的概念去污染名词!
beryl
2020-09-22 14:04:28 +08:00
@reus 不是状态服务器,还是想着用状态机的概念去处理服务
#1 的概念我理解是状态服务器
hugedata
2020-09-22 14:05:26 +08:00
楼主和一楼说的“状态机”可能和我理解的状态转换的状态机( State Machine )不一样……
beryl
2020-09-22 14:09:32 +08:00
@hugedata 那换个问法:
State Machine 的应用场景是什么呀,还是只是概念术语
catror
2020-09-22 14:09:34 +08:00
7 楼+1,看得我一脸懵逼
timsims
2020-09-22 14:15:54 +08:00
楼主不如简述一下你想通过你所指的 “状态机” 解决怎样的问题
beryl
2020-09-22 14:16:34 +08:00
@timsims 嗯呢,补充了下问题
opengps
2020-09-22 14:17:56 +08:00
看了 append,文中“状态机”不是我理解的状态服务器
zlowly
2020-09-22 14:20:25 +08:00
为什么我感觉题主描述的场景更接近于工作流引擎?
beryl
2020-09-22 14:23:04 +08:00
@zlowly 是想着 workflow 和 state machine 结合的方案
jintianfengda
2020-09-22 14:27:21 +08:00
状态机就是用来维护实体的状态的玩意,当一个实体的状态比较多且比较复杂的时候,都可以引入状态机来统一管理状态流转,通过"动作"来进行状态的变更,我理解这个 statemachine 这个跟架构有一丢丢关系,但是不大,跟一楼说的状态服务器不是一个东西
Lonersun
2020-09-22 14:43:08 +08:00
您看看这篇文章,不知能不能解答一些你的问题 https://juejin.im/post/6844903817192947726
imn1
2020-09-22 14:49:25 +08:00
比较关键是状态有限(可以全部列举),每个状态都是固定的,只会出现不同的状态,而单个状态本身不变
服务器场景我不熟,但可以从其他方面说一下问题 2

1.有序的状态切换,这个有序是固定的、必经的,每个状态都要轮训一遍
例如上述订单流程

2.无序但有限几个状态之间无级切换,每次状态改变需要做固定接口的处理
例如有限个外观主题之间切换
我在一个 GUI 项目里面用了十多个状态机,处理一些独立的控件 event,这些控件不会和其他控件组合,一旦改变就会直接执行程序,这样只要控件的参数值有限,类型只有一个,多少个参数值就是多少个状态了

其实可以这样说,GUI 的控件都是固定的,程序就是处理控件产生的参数改变和组合而已,理论上可以全部用状态机写,理论上;只是有些参数值和类型太多,多个控件组合出来的状态可能无穷多,状态机无法全部列举而已

状态机是省代码和省思考,因为状态固定,状态进出处理的函数也固定(不太复杂),要想的就是状态变化的可能,穷举列出来而已
目前我所知的状态机处理第二种还是比较麻烦的,例如 3 种状态,要列明 1-2, 2-1, 1-3, 3-1, 2-3, 3-2 等所有排列组合情况,比较好的是如果这些 123 状态只是简单的标识区别,可以 for+排列组合 来完成这个定义,如果复杂一些就不好使了,还不如写个变参函数方便

顺便也举个不适用例子,也是这个 GUI 项目,最初想把语言切换(汉英)也写成状态机,后来考虑到将来要增加语言(日韩……),而且语言变化还有细微不同(状态不完全固定),感觉用状态机是给自己挖坑,就放弃了,改用事件信号+函数
zhuangzhuang1988
2020-09-22 14:52:38 +08:00
chanxiaoxi
2020-09-22 15:04:59 +08:00
我猜你说的是 State Pattern 设计模式
Ariver
2020-09-22 15:07:33 +08:00
工作流啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/709373

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX