Zeebe服务学习2-状态机
1.什么是状态机?
第一次接触到这个名词,感觉自己是明白这个东东是啥的,但是后来发现,emm…,是的,只是理解了这个词而已。
贴一下官方介绍:
有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。 有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在计算机科学中,有限状态机被广泛用于建模应用行为、硬件电路系统设计、软件工程,编译器、网络协议、和计算与语言的研究。
2.状态机有啥用?
说了那么多,show me the code!这个状态机具体能干啥?不然我学它干啥,屠龙之术,学了只能吹吹牛皮而已。
举个例子,介绍个简单的场景,现在有个流程:出库->修改库存->发货。
每个单据都有三个状态,CREATED,ACTIVITED,COMPLETED;我们一般会这样处理,调用新建出库单据,此时单据的状态是CREATED,
当该单据没有确认完成之前,该单据是ACTIVITED状态,
如果确认这个新建成功了,则更新该单据为COMPLETED状态;
如果想要继续执行这个流程,那么需要根据出库的单据上的状态做判断,如果是ACTIVITED,那么还不能去·`修改库存`;
如果是COMPLETED状态了,那么去修改库存单据;
同理,修改库存单据上也有三个状态…..,以此类推,每个单据都要去更新自身的状态,然后判断单据状态是否满足条件,才能确认是否执行下游的方法。
上面举得例子很简单,如果流程特别长,那么这种重复的更新、判断是不是太累了?那么累,是不是我们程序员没有做好啊?
这时候,可以用我们的主角:状态机登场。
状态机维护状态:CREATED,ACTIVITED,COMPLETED。
状态的变化是由事件触发的,换成公式就是:
State(S) + Event(E) -> Actions (A), State(S')
一个老的状态,经过一个事件触发,发生一个行为,然后状态变成了新状态。
状态机的好处是通过把状态与事件分开,通过上述的公式,把一团逻辑解耦成一个公式去完成,事件只会被触发,行为关联事件去执行,
那么业务就不用去操心if else了,只管去触发关联事件就行了。
3.Zeebe框架咋用的?
Zeebe框架的每个服务节点都是有三个状态的:CREATED,ACTIVITED,COMPLETED。
举例:当一个节点实体经过createEvent触发,引起create行为,该实体状态就变成了CREATED;
当触发一个activeEvent,产生激活行为(调用新建的JobWorker),该实体变成ACTIVITED;当新建的JobWorker调用完成,触发compleEvent,
此时Zeebe更新该实体状态为COMPLETED。
这些过程,对于Zeebe服务调用者是不可见的,开发者只会发现,自己的流程的新建节点已经完成,开始进入下面的服务节点中了。
参考:(1)https://blog.csdn.net/qq_30739519/article/details/89444631
(2)https://blog.csdn.net/xinghuanmeiying/article/details/81586954
Zeebe服务学习2-状态机的更多相关文章
- Zeebe服务学习1-简单部署与实现demo
1.Zeebe是什么? Camunda公司研发的工作流引擎Zeebe,目标是对微服务的编排.具体详细介绍可以参考官网:https://zeebe.io/what-is-zeebe/ 2.背景 随着微服 ...
- Zeebe服务学习5-多实例特性实践
一.背景 在0.21版本之前,Zeebe不支持多实例元素,在2019年10月9号发布的0.21版本中,加入这一特性, 主要是体现在Zeebe Modeler 0.7.0以及之后的版本中. 二.特性介绍 ...
- Zeebe服务学习3-Raft算法与集群部署
1.背景Zeebe集群里面保证分布式一致性问题,是通过Raft实现的,其实这个算法用途比较广泛,比如Consul网关,也是通过Raft算法来实现分布式一致性的. 首先简单介绍一下Raft: 在学术界, ...
- angular的uiRouter服务学习(4)
本篇接着上一篇angular的uiRouter服务学习(3)继续讲解uiRouter的用法 本篇主要讲解uiRouter的url路由 大多数情况下,状态是和url相关联的: 当url改变,激活对应的状 ...
- angular的uiRouter服务学习(3)
本篇接着上一篇 angular的uiRouter服务学习(2) 继续讲解uiRouter的用法 本篇主要讲解uiRouter的多个命名的视图 我们可以给ui-view元素添加ui-view的值来给它命 ...
- angular的uiRouter服务学习(2)
本篇接着上一篇 angular的uiRouter服务学习(1) 继续讲解uiRouter的用法 本篇主要讲解uiRouter的嵌套状态&嵌套视图 嵌套状态的方法: 状态和状态之间可以互相嵌套, ...
- SpringCloud微服务学习笔记
SpringCloud微服务学习笔记 项目地址: https://github.com/taoweidong/Micro-service-learning 单体架构(Monolithic架构) Mon ...
- 微服务学习笔记(1)——使用MagicOnion实现gRPC
原文:微服务学习笔记(1)--使用MagicOnion实现gRPC 1.什么是gRPC 官方文档:https://grpc.io/docs/guides/index.html 2.什么是MagicOn ...
- 微服务学习笔记(2)——使用Consul 实现 MagicOnion(GRpc) 服务注册和发现
原文:微服务学习笔记(2)--使用Consul 实现 MagicOnion(GRpc) 服务注册和发现 1.下载打开Consul 笔者是windows下面开发的(也可以使用Docker). 官网下载w ...
随机推荐
- 2020牛客暑期多校训练营(第八场)Interesting Computer Game
传送门:Interesting Computer Game 题意 给出n对数,你可以操作n次,每次操作只能在下面三种中选择一种,问最多可以选多少个不同的数字. 什么都不做 如果a[i]以前没选过,那么 ...
- AtCoder Beginner Contest 173
比赛链接:https://atcoder.jp/contests/abc173/tasks A - Payment 题意 计算只用 $1000$ 元支付某个价格 $n$ 的找零是多少. 代码 #inc ...
- Codeforces Round#630 div2 A~C题解
...
- HDU - 3282 优先队列的使用
题意: 按照顺序给你n个数,当数的数量是奇数的时候就输出它们的中位数 题解: 优先队列默认是大顶堆,即priority_queue.top()是这个队列中的最大值 那么我们就可以先创造一个大顶堆优先队 ...
- CF1463-C. Busy Robot
题意: 你有一个机器人,这个机器人在一维坐标轴上移动.你可以给这个机器人下达指令,指令的形式为 \(t_i, x_i\) ,意味着机器人在第\(t_i\)秒的时候获得一条指令,此时这个机器人以\(1/ ...
- Nginx基础 - 配置静态web服务
1.静态参数配置1)文件读取高效sendfile Syntax: sendfile on | off; Default: sendfile off; Context: http, server, lo ...
- Oracle数据库故障处理方法
1.启动数据库报错:ORA-01102:cannot mount database in EXCLUSIVE mode 给客户处理oracle故障,遇到如下报错: 以sys登录至数据库,执行shutd ...
- ArcGIS处理栅格数据(三)
六.制作镶嵌数据集(栅格数据集优点:a.浏览速度快:b.入库速度快:c.可指定区域显示) 1.右键目录中的数据库,新建"镶嵌数据集". 2.添加栅格数据. 3.定义金字塔. 4.构 ...
- ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)
cmd mysql -h localhost -u root -p r然后报错 ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost ...
- POJ - 3665 icow
Fatigued by the endless toils of farming, Farmer John has decided to try his hand in the MP3 player ...