脑图梳理流程真的是绝了,可惜少了一些逻辑判断节点.
技术设计金字塔 包含了状态设计文章
如果你用了,注意流程复用,策略点的复用. (本质上内含了 实体复用, 抽象父类)
会导致流程模板的嵌套. 例如某个业务流程有很多, 需要依赖某个业务的一个流程.
方案一: 引擎type法. 在processTemplate的某个processor通过某个type处理不同的业务. 也可以通过mq异步化解耦.
方案二: 组合法. 另外一个模式是 组合模式. 在入口处先判断业务. 使用不同的业务实体/流程. 里面当前实体的processor里调用复用流程的processTemplate执行
理念 - 反对用模板,用流程引擎实现业务
先强调一点. 业务系统, 要学习 ,反对用模板,用流程引擎实现业务. 除非有人参与,必须用流程引擎,不然不要用状态机or流程引擎, 不要用. 但是要学习流程引擎,只是让自己有流程意识,但不用用来实现业务. 业务系统维护同学换来换去,刚记牢每个handler之间的关系,就换系统了. java 强类型之所以变成企业首选, 就是因为强类型 , 可以顺着代码阅读,理解流程. 代码面前了无秘密. 不仅仅码农在用流程引擎,企业战略和执行也是利用流程引擎的.
下面是一些工作流引擎产品列表:
- 轻量级工作流引擎,如:Camunda,Activiti,JBoss jBPM。
- BPM套件遵循“零代码”方法,如:IBM,Pega,Software AG。
- 带DSL的纯状态机,如:Amazon Simple Workflow,Netflix conductor。
- 简单的“事件反应机器”,如:IFTTT,Zapier,Microsoft Flow。
- 大数据或ETL的数据流框架,如:Spring Cloud数据流,Apache Airflow。
在BPM领域有一个标准的图形化符号语言BPMN,遵循零代码或少写代码的宗旨,BPMN 2.0以后融入了BPEL,从而实现人工流和服务流程的综合调度编排。
BPM有很多种建模语言,BPMN(Business Process Modeling Notation)就是其中的一种建模语言。 深入浅出了解BPM、BPMN、BPMN2.0 - 纪晓元 - 博客园
先说明两个场景:
支付场景. 从本来的整体支付,部分退款到可以多次支付,到多次退款. 到可以垫付.(垫付这个,没有流程引擎思维很难想通状态设计怎么设计更好).
支付变化: 加入垫付. 把原来线性流程变成了 ,有一个就分润流程.
\
--分润->
/
会议室预订场景: 审批预订和普通预订能否共用一套底层预订系统. 类似订单快车和专车,代驾能否共用一套系统. 同一个会议室可以从审批切换到非审批.
审批中推送给设备变化: 审批中本来不推送显示. 现在改成了推送显示. 抢占中也是.
审批流程变化: 本来一个会议室
我的类似其他文章: 1.业务系统中最核心的状态设计,异常 case. (系统设计)
2. 从接口的前置状态校验 到 状态模式的方法是否能执行 再 有限状态机(FSM)的事件校验 ,状态机
4. 需求拆分到设计流程总览(职业生涯的各个时间点的成长)
type,status设计原则:
1.按照某个视角. 预订列表视角(不区分审批拒绝和审批取消).而不是我的预订视角(区分审批拒绝和审批取消),crm (更恐怖需求,按照状态排序).
2.type是否可以放置到一起,看是否互斥. 例如 周期预订和审批预订是否可以设置共同的type. (即bookType取值1.普通预订 2.审批预订 3.周期预订) 答案最好不要,因为审批预订也可以是周期预订,可同时都是.
难点:
1. 事件流写法和中台组合写法如何共存? 一个中台事件流发出后,有时候无法区分业务. 例如: 会议取消. 底层可以触发. 但是确少了这是 审批取消还是真的取消. 下游需要先得到这个实体,然后转换为对应的具体类. 再获取对应的业务数据.
2. 事件流最好越少越好,收拢到中台,事件流信息越少越好. 最好只有一个id,没有其他数据 (抛开读写分离影响). 中台状态越少越好,从预订展示视角设计,业务性状态业务层维护(例如 拒绝取消和审批取消)
学习流程引擎的各种组件能够让你更好的理解需求,将需求流程落地成文稿.
如果要用流程引擎,因为业务上流程经常变,
流程引擎必须具备流程变更的能力,要实现流程变更的能力,引擎要具备几大能力:
- 更新流程定义的能力 change process definition.
- 实例执行具有动态"选择版本"的能力. ( 或者 查询+修改当前实例版本的能力)
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 - 新建引擎时能,设置初始状态的能力.
举个例子, 支付本来是用户支付成功即分润. 但后来有了垫付. 状态有两个视角,
用户视角: 初始化 - 未支付 - 支付成功.
司机视角: 初始化 - 已支付(垫付) - 分润成功
因为业务需要需要新建一个司机视角的流程,但是此状态应该属于未支付状态.
有了垫付之后的状态设计和之前的代码改动会很大!!! 代码设计如何保持之前的改动最小.
另外一个场景: 一个时间和会议室本来只能被抢占一次,后来有了一个产品逻辑. 审批中可以被抢占多次.