业务开发同学需要有流程引擎的思维.(包含了状态分层设计,事件设计,不同视角的状态展示[前台,后台], 事件流思维,业务模块切分到开闭代码的能力)

50 篇文章 0 订阅
2 篇文章 1 订阅

脑图梳理流程真的是绝了,可惜少了一些逻辑判断节点.

技术设计金字塔 包含了状态设计文章

流程引擎思维/状态机思维

 如果你用了,注意流程复用,策略点的复用. (本质上内含了 实体复用, 抽象父类)

会导致流程模板的嵌套. 例如某个业务流程有很多, 需要依赖某个业务的一个流程.

方案一: 引擎type法. 在processTemplate的某个processor通过某个type处理不同的业务. 也可以通过mq异步化解耦.

方案二: 组合法. 另外一个模式是 组合模式. 在入口处先判断业务. 使用不同的业务实体/流程. 里面当前实体的processor里调用复用流程的processTemplate执行

理念 - 反对用模板,用流程引擎实现业务

先强调一点. 业务系统, 要学习 ,反对用模板,用流程引擎实现业务. 除非有人参与,必须用流程引擎,不然不要用状态机or流程引擎, 不要用. 但是要学习流程引擎,只是让自己有流程意识,但不用用来实现业务. 业务系统维护同学换来换去,刚记牢每个handler之间的关系,就换系统了. java 强类型之所以变成企业首选, 就是因为强类型 , 可以顺着代码阅读,理解流程. 代码面前了无秘密. 不仅仅码农在用流程引擎,企业战略和执行也是利用流程引擎的.

下面是一些工作流引擎产品列表:

  在BPM领域有一个标准的图形化符号语言BPMN,遵循零代码或少写代码的宗旨,BPMN 2.0以后融入了BPEL,从而实现人工流和服务流程的综合调度编排。

工作流与BPM -解道Jdon

 BPM有很多种建模语言,BPMN(Business Process Modeling Notation)就是其中的一种建模语言。 深入浅出了解BPM、BPMN、BPMN2.0 - 纪晓元 - 博客园

先说明两个场景:

 支付场景. 从本来的整体支付,部分退款到可以多次支付,到多次退款. 到可以垫付.(垫付这个,没有流程引擎思维很难想通状态设计怎么设计更好).

支付变化: 加入垫付. 把原来线性流程变成了 ,有一个就分润流程.

      \

           --分润->

      /

会议室预订场景:  审批预订和普通预订能否共用一套底层预订系统. 类似订单快车和专车,代驾能否共用一套系统. 同一个会议室可以从审批切换到非审批.

 审批中推送给设备变化: 审批中本来不推送显示. 现在改成了推送显示. 抢占中也是.

 审批流程变化: 本来一个会议室

我的类似其他文章: 1.业务系统中最核心的状态设计,异常 case. (系统设计)

2. 从接口的前置状态校验 到 状态模式的方法是否能执行 再 有限状态机(FSM)的事件校验 ,状态机

3. 源代码写文档-启动流程(入口)+运行流程(入口)

4. 需求拆分到设计流程总览(职业生涯的各个时间点的成长)

5. 交易系统模块划分,模块拆分,设计,重构实战.状态

type,status设计原则:

   1.按照某个视角. 预订列表视角(不区分审批拒绝和审批取消).而不是我的预订视角(区分审批拒绝和审批取消),crm (更恐怖需求,按照状态排序).

  2.type是否可以放置到一起,看是否互斥. 例如 周期预订和审批预订是否可以设置共同的type. (即bookType取值1.普通预订 2.审批预订 3.周期预订) 答案最好不要,因为审批预订也可以是周期预订,可同时都是.

难点:

     1. 事件流写法和中台组合写法如何共存? 一个中台事件流发出后,有时候无法区分业务.  例如: 会议取消. 底层可以触发. 但是确少了这是 审批取消还是真的取消.  下游需要先得到这个实体,然后转换为对应的具体类. 再获取对应的业务数据.

    2. 事件流最好越少越好,收拢到中台,事件流信息越少越好. 最好只有一个id,没有其他数据 (抛开读写分离影响). 中台状态越少越好,从预订展示视角设计,业务性状态业务层维护(例如 拒绝取消和审批取消)

学习流程引擎的各种组件能够让你更好的理解需求,将需求流程落地成文稿.

如果要用流程引擎,因为业务上流程经常变,
流程引擎必须具备流程变更的能力,要实现流程变更的能力,引擎要具备几大能力:

  1. 更新流程定义的能力 change process definition.
  2. 实例执行具有动态"选择版本"的能力. ( 或者 查询+修改当前实例版本的能力) 
    3.1 activiti 有修改实例版本能力. 根据这个问题来看,activiti只能手动修改,但不具备动态选择. 
    Editing a current process definition in Activiti - Stack Overflow 
    获取当前流程最新版本号的能力. get latest version process definition How to update in-flight process instances definition after publishing a new workflow version in APS – HowTo Brothers
  3. 新建引擎时能,设置初始状态的能力. 
    举个例子, 支付本来是用户支付成功即分润. 但后来有了垫付. 状态有两个视角,
        用户视角: 初始化 - 未支付 - 支付成功. 
        司机视角: 初始化 - 已支付(垫付) - 分润成功
    因为业务需要需要新建一个司机视角的流程,但是此状态应该属于未支付状态.   
    有了垫付之后的状态设计和之前的代码改动会很大!!! 代码设计如何保持之前的改动最小.  
    另外一个场景: 一个时间和会议室本来只能被抢占一次,后来有了一个产品逻辑. 审批中可以被抢占多次.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值