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. 【LA 3487】Duopoly(图论--网络流最小割 经典题)

    题意:C公司有一些资源,每种只有1个,有A.B两个公司分别对其中一些资源进行分组竞标,每组竞标对一些资源出一个总价.问C公司的最大收益. 解法:最小割.将A公司的竞标与源点相连,B公司的与汇点相连,边 ...

  2. 【noi 2.7_2987】小兔子捡金币(算法效率)

    题意:问蛇形回文的访问次序. 解法:很基础的一道题,先算出询问的点处在第几环,再用4个while一个个走一遍这一圈.P.S.我一直想办法想用不用while(),可是真的一直WA!所以用while()既 ...

  3. hdu5564 Clarke and digits

    Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission ...

  4. VSCode配置Python开发环境

    https://blog.csdn.net/vinkim/article/details/81546333 https://zhuanlan.zhihu.com/p/31417084

  5. UWP(二)调用Win32程序

    目录 一.如何构建Win32程序 二.如何构建UWP工程? 三.Samples 一.如何构建Win32程序 打开csproj文件,使用如下代码添加引用(Reference).注意,如果指定位置不存在, ...

  6. Redis的主从架构+哨兵模式

    Redis主从架构 redis主从架构搭建,配置从节点步骤: 1.复制一份redis.conf文件的目录 cd /usr/local/java cp -a redis redis_6380 2.将相关 ...

  7. 牛客网多校第4场 J Hash Function 【思维+并查集建边】

    题目链接:戳这里 学习博客:戳这里 题意: 有n个空位,给一个数x,如果x%n位数空的,就把x放上去,如果不是空的,就看(x+1)%n是不是空的. 现在给一个已经放过数的状态,求放数字的顺序.(要求字 ...

  8. codeforces 3D (非原创)

    D. Least Cost Bracket Sequence time limit per test 1 second memory limit per test 64 megabytes input ...

  9. POJ 2288 Islands and Bridges(状压DP)题解

    题意:n个点,m有向边,w[i]表示i的价值,求价值最大的哈密顿图(只经过所有点一次).价值为:所有点的w之和,加上,每条边的价值 = w[i] * w[j],加上,如果连续的三个点相互连接的价值 = ...

  10. js sort tricks All In One

    js sort tricks All In One js 排序技巧 const arr = [ { label: 'False 1 ', disabled: false, }, { label: 'F ...