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-状态机的更多相关文章

  1. Zeebe服务学习1-简单部署与实现demo

    1.Zeebe是什么? Camunda公司研发的工作流引擎Zeebe,目标是对微服务的编排.具体详细介绍可以参考官网:https://zeebe.io/what-is-zeebe/ 2.背景 随着微服 ...

  2. Zeebe服务学习5-多实例特性实践

    一.背景 在0.21版本之前,Zeebe不支持多实例元素,在2019年10月9号发布的0.21版本中,加入这一特性, 主要是体现在Zeebe Modeler 0.7.0以及之后的版本中. 二.特性介绍 ...

  3. Zeebe服务学习3-Raft算法与集群部署

    1.背景Zeebe集群里面保证分布式一致性问题,是通过Raft实现的,其实这个算法用途比较广泛,比如Consul网关,也是通过Raft算法来实现分布式一致性的. 首先简单介绍一下Raft: 在学术界, ...

  4. angular的uiRouter服务学习(4)

    本篇接着上一篇angular的uiRouter服务学习(3)继续讲解uiRouter的用法 本篇主要讲解uiRouter的url路由 大多数情况下,状态是和url相关联的: 当url改变,激活对应的状 ...

  5. angular的uiRouter服务学习(3)

    本篇接着上一篇 angular的uiRouter服务学习(2) 继续讲解uiRouter的用法 本篇主要讲解uiRouter的多个命名的视图 我们可以给ui-view元素添加ui-view的值来给它命 ...

  6. angular的uiRouter服务学习(2)

    本篇接着上一篇 angular的uiRouter服务学习(1) 继续讲解uiRouter的用法 本篇主要讲解uiRouter的嵌套状态&嵌套视图 嵌套状态的方法: 状态和状态之间可以互相嵌套, ...

  7. SpringCloud微服务学习笔记

    SpringCloud微服务学习笔记 项目地址: https://github.com/taoweidong/Micro-service-learning 单体架构(Monolithic架构) Mon ...

  8. 微服务学习笔记(1)——使用MagicOnion实现gRPC

    原文:微服务学习笔记(1)--使用MagicOnion实现gRPC 1.什么是gRPC 官方文档:https://grpc.io/docs/guides/index.html 2.什么是MagicOn ...

  9. 微服务学习笔记(2)——使用Consul 实现 MagicOnion(GRpc) 服务注册和发现

    原文:微服务学习笔记(2)--使用Consul 实现 MagicOnion(GRpc) 服务注册和发现 1.下载打开Consul 笔者是windows下面开发的(也可以使用Docker). 官网下载w ...

随机推荐

  1. UESTC 360(1425) another LCIS

    这道题是CD老OJ上面的一道题,现在在新OJ上的题号是360,开始在VJ上做的提交一直RE(囧).后来才知道OJ移位了. 这道题是一个简单的成段更新+区间合并的线段树的题,1A还让我小激动了一下 这道 ...

  2. Codeforces Round #531 (Div. 3) D. Balanced Ternary String (贪心)

    题意:给你一个长度为\(3*n\)的字符串,要求修改最少的次数,使得字符串中\(0,1,2\)的个数相同,并且在最少次数的情况下使字典序最小. 题解:贪心,\(0\)一定放在前面,\(1\)和\(2\ ...

  3. k8s二进制部署 - coredns安装

    coredns的资源清单文件rabc.yaml apiVersion: v1 kind: ServiceAccount metadata: name: coredns namespace: kube- ...

  4. 【原创】docker & kubernetes问题总结

    1.entrypoint & cmd 指令的区别 这主要考察 Dockerfile 良好实践中关于容器启动时运行的命令. entrypoint 和 cmd 命令都是设置容器启动时要执行的命令, ...

  5. 网络之一次http请求的完整过程

    关于网络的知识平时可能真正用的比较少,但是有一些点还是需要总结的: 完成一次http请求要大致可以分为7个步骤: 一.TCP三次握手 第一次握手:建立连接.客户端发送连接请求报文段,将SYN位置为1, ...

  6. 牛客网多校第4场 D Another Distinct Values 【构造】

    题目:戳这里 题意,n*n的矩阵,只能填-1,0,1,问能不能使该矩阵的任意行和列的和都不想等. 解题思路:戳这里 可以说是一目了然了 附ac代码: 1 #include<iostream> ...

  7. linux repo init 遇到的问题

    问题描述: 利用repo从远程服务器上取代码时候,出现错误  fatal: cannot make .repo directory:Permission denied, 加了sudo 之后,还是不行, ...

  8. HihoCoder1445 后缀自动机二·重复旋律5(后缀自动机 子串种数)

    题意: 询问串的不同子串个数 思路: 后缀自动机每个节点表示以当前字符结尾的一系列后缀,个数为\(maxlen - minlen\),其中\(minlen = maxlen[father]\). 代码 ...

  9. Docker--Image and Container

    2.1 深入探讨Image  说白了,image就是由一层一层的layer组成的. 2.1.1 官方image https://github.com/docker-library mysql http ...

  10. js with All In One

    js with All In One 不推荐,要废弃 function f(x, o) { with (o) { console.log(x); } } function f(foo, values) ...