轻量工作流模块的前世今生
背景:
在诸多系统中的存在流程的概念,这就引出一个概念系统-工作流系统,当今市场上存在很多工作流系统,Activiti和Flowable都是比较出名的产品。但是,如果我们想要在现有系统中引入工作流系统,现有的开源工作流又显得过于庞大且学习成本较高,在此背景下,笔者在工作外开始进行工作流方面的思考,于是引出了这篇文章。
所谓前世今生,前世是对工作流问题的总结,今生是工作流的设计。
前世
系统中节点流转中我们经常碰到几个问题:
- 没有完善的骨架支持整个流程,流程的更迭更多是在堆代码的行为下进行。
- 业务流和工作流强耦合,业务流常伴随工作流的信息,即业务逻辑中参杂大量的工作流信息,例如业务流直接声明下一节点,流程的变更必然引起代码的修改。
- 一致性问题,由于业务流程中存在各种未知问题,同时工作流系统也存在很多未知问题,若不能很好的控制事务,必然会导致大量的工作流和业务流信息不一致的问题。
- 开发难度大,正如背景所讲,Flowable本身作为一个庞大的系统,若想快速上手并投产使用需要掌握大量的知识,同时需要将现有系统业务流融入到工作流中。
- 缺少节点事件,更多的时候我们需要在流程流转或流程的关键节点设计回调机制,例如,当流程完成后发送短信发送审批结果。
- 可扩展性,如何快速且快捷的进行流程迭代也是重要的一环。
设计思路
工作流设计
明确工作流引擎基本功能
-
创建
负责流程实例的初始化 【例】发起请假流程
-
签收
签收当前节点的流程节点,可对当前节点进行操作 【例】主管自动签收组员的请假审批节点
-
完成
完成当前的流程节点 【例】主管对请假审批节点给出审批意见
工作流的扩展功能
- 指派流程,流程可以指定给某个用户进行审批等处理
- 权限控制,可以对签收、发起、审批等行为进行安全校验
- 关键节点回调,在流程处理到关键节点,留有扩展接口进行功能扩展。
模块化设计
-
业务流程和工作流流程解耦
工作流可以绑定业务事件
-
模块直接流转依赖配置,而不是代码
例如出具 同意,则进入下一节点(无需关心下一节点是什么,依靠配置),而不是在代码中明确出下一节点。
流程设计中,各个流程是单独的模块,应该尽可能的消除节点之间的依赖关系,即使调整顺序,也可以正常进行流程流转
实现方案
工作流参与实体
| 实体 | 描述 | 基础信息(部分信息) |
|---|---|---|
| 流程定义信息 | 定义流程信息 | 流程代码、流程名称 |
| 流程节点信息 | 定义流程中的每个节点相关的信息 | 节点代码、节点名称、节点类型 |
| 流程路由信息 | 定义节点之间的流转信息 | 流程定义、当前节点、下一节点 |
| 流程实例信息 | 定义信息的实例化 | 业务参数、当前节点、审批时间 |
| 流程审批信息 | 每个节点的审批信息 | 审批结论、审批时间 |
业务事件绑定
我们在定义节点信息的时候,可以使用事件/bean的形式对该节点的业务行为进行补充,如组长审批节点,定义组长审批事件,当节点推进到组长审批的时候,自动执行组长审批事件,同时自定义审批事件【正常情况下】不会直接输出下一节点信息,使用审批结论进行流程流转。
数据一致性保障
我们有了业务流和工作流,数据一致性问题是个巨大的问题。
解决方案比较灵性, 需要一定的前置知识:Spring事务 | Yiwyn’s ~ShenZhi Blog
使用事务同步进行一致性操作,将工作流流程推进置于提交。