工作流引擎核心设计思路!

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:vivo互联网技术


作者:vivo 互联网服务器团队- Cheng Wangrong

一、业务背景

营销自动化平台可以支持不同用户生命周期的活动旅程策略配置 ,根据用户触发的不同活动行为,进行差异化的营销触达方案。同时各种类型活动的具体执行过程中也有不同的业务处理流程(比如审批流程和业务流转)。业务流程复杂多样,需求变更频繁,项目开发过程中会有以下痛点:

  1. 项目交付周期长: 一个完整的业务流程需要从头开始按版本迭代,开发时间长,成本高。

  2. 功能重复开发测试: 业务之间会掺杂着很多共性的流程,导致大量重复性开发测试工作,效率低。

  3. 维护成本高: 随着项目业务的逐步发展,业务流程逐步积累,可维护性下降,系统改动牵一发而动全身。

如何将业务逻辑从控制流中剥离出来,让产研人员更聚焦于业务的实现是需要重点解决的问题。而传统OA领域使用的是久经考验的业务流程管理解决方案 —— 工作流(Workflow) 。工作流是一套工业级的解决方案,由工作流管理联盟(WfMC)制定了一系列的标准。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

二、工作流介绍

2.1 工作流定义

工作流(Workflow) —— 对工作流程及其各操作步骤之间业务规则的抽象,将流程中的工作组织逻辑和规则进行建模,交由计算机进行自动处理。

工作流的本质思想 是:通过预定义的工作流程模板,对现实活动进行实例化的过程 。简单说就是通过预设的格式或者可视化配置好流程的模板(比如一种分享活动的运行流程模板),使用时通过该模板构造出一个流程实例对象,通过实例对象完成活动运行跟踪和回溯。

2.2 工作流参考模型

WfMC工作流管理联盟为工作流制定了参考模型,其核心就是中间的工作流引擎,工作流引擎提供流程定义工具(接口1)、给使用者提供信息查询(接口2)、调用外部应用(接口3)、整合其他工作流(接口4)和监控管理(接口5)的能力。对于大多数工作流产品而言,重点关注的是接口1和接口2的实现。

c455a01d5d44ca0369e28292c312bf6f.png

2.3 工作流引擎关键特性

  1. 流程可视化

    提供可视化的流程搭建,流程视图查看能力,以及实时观测任务运行能力。

  2. 业务可编排复用

    将公共业务进行组件化,可以支持任务的自由编排,自由搭建出适合的业务的不同流程。

  3. 业务和控制分离

    将流程的控制(如流转、判断、循环、重试等)的任务交由工作流负责,让使用者聚焦于核心业务逻辑。

2.4 工作流引擎的类型

对于工作流的类型没有专门的标准,按照流程任务节点特性可以分为:

  • 顺序工作流

    顺序工作流的运行方式类似一种特定的流程图,上一个流程任务完成后依次进入下一个流程任务,过程不可逆。

f563a5c816fe5b6e96a27fb93660f4d1.png
  • 状态机工作流

    状态机工作流侧重关注的是流程任务的状态,驱使任务状态发生变化的因素一般为外部事件,即事件驱动的方式,驱使任务节点从一个状态运行到另外一个状态,节点间可逆。

dd41ca3a289dd715c73fc416002c68a3.png
  • 规则驱动工作流

    侧重于节点的运转规则,基于业务规则进行工作流程的执行,在处理具有明确目标但“规则”或规范级别不同的各种项目时,规则驱动的工作流非常有用。

21d3f491edcc1e3c96c43ef918883883.png

可以看到不同类型的工作流不是完全割裂的,状态机工作流中也可以结合着条件和规则进行操作节点转换的过程。在软件开发中,一般会考虑结合状态机和规则驱动的工作流。

2.5 工作流引擎和状态机的差异

在之前的文章里面,我们有对状态机和工作流引擎 做过一次简单的对比 ,事实上,两者之间并不是一个完全对等的概念:

  1. 状态机 是系统状态以及这些状态之间转移和动作等行为的数学计算模型,

    工作流 是对整体工作流程及其各操作步骤之间业务逻辑和规则的抽象建模。

  2. 状态机 模式是事件驱动型,大多通过外部事件触发状态的自动流转;

    工作流引擎 更侧重于描述预定义流程任务完成之后的自动流转,可预测性会更强。

  3. 从适用场景的复杂性上看,

直接使用状态机 的方式可以清晰地描绘出所有可能的状态以及导致转换的事件,适用于解决单维度、复杂度不高的业务问题,发挥灵活轻便的特点;

工作流引擎 则更适合复杂的业务流程管理,解决如大型CRM复杂度更高的流程自动化问题,聚焦于改善整体业务流程的效率。

  1. 工作流引擎 是可以在状态机的结构模型基础上进行构建,事实上很多开源的工作流引擎也都是基于状态机的实现方式。

了解了工作流的基本特点和使用场景之后,我们来看一下比较流行的开源工作流引擎。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

三、开源工作流引擎

b7916f7377afee0bffa163dbf63620f9.jpeg

四、工作流引擎自研设计

4.1 使用开源工作流引擎的问题

  1. 开源工作流最大的优势是可以借助开源的资源,开箱即用,功能全面,但是与之带来的是附带的配置和表数量比较多的维护问题。以Activiti为例,使用Activiti7.0版本至少要引入二十多张表,虽然说看似是无侵入的方式,但是系统演进和维护过程中有一定的成本。特别是业务流程实例很多的时候,开发人员需要对表逻辑有更深的把控。

  2. 由于业务的客观独特性,作为业务流程组件,一般都需要根据自身业务进行二次开发适配。比如需要根据自身组织架构,进行流程节点用户角色权限的管控;将自身的业务能力插件化,加入工作流程配置中,进行拦截回调等。

4.2 自研引擎核心设计思路

4.2.1 引擎核心模块

回归工作流的本质, 工作流是通过预定义的流程模板,对现实活动进行实例化的过程。一个基本的工作流引擎主要包括三大核心部分:

  • 流程模板创建

    根据业务规则和逻辑,创建流程模板,设置每一个节点的操作和变更路径。基于模板创建,可以延伸出流程设计器、插件式节点,多样化的模板文件格式、模板持久化等。

  • 流程实例发布

    根据流程模板,创建一个流程实例,流程模板和流程实例的关系类似类和对象的关系。比如说工单系统管理员定义好一个审批流模板(流程模板),用户点击创建一个工单(流程实例)。基于流程实例发布,又可以延伸出实例实时观测,节点变迁记录回溯,实例状态持久化,失败重试,事务控制等。

  • 任务流程执行

    创建好流程实例之后,流程实例只需要按照流程模板的定义独立执行各自实例的任务,不同的实例之间互不影响,完成各自实例的生命周期。

8ec863052f39a261cee02b22981e9006.png

4.2.2 引擎核心设计

① 应用容器启动时,加载流程引擎环境配置,包括解析器构造,流程引擎上下文,流程定义文件路径等。

② 读取定好的流程定义文件,进行流程节点解析,构建好执行上下文,将流程节点放到内存缓存中。

③ 业务侧进行流程创建,启动一个新的流程实例,同时将业务流程和流程实例进行绑定。

④ 运行流程实例各个节点,将每个流程节点进行持久化保存。

6766cb5d072ff3e4e9890238e5a5a2f0.png

4.3 具体实践

① 引擎核心服务。

引擎操作的主要对外接口,包括启动流程实例,和获取相关流程定义模板,流程实例,流程节点的服务。

public interface FlowEngine {
 
    /**
     * 根据流程定义key,参数列表启动流程实例
     *
     */
    FlowInstance startInstance(String processDefKey, Map<String, Object> args);
 
    /**
     * 根据流程定义主键ID,参数列表执行流程任务(推动流程自动流转)
     * 统一事务控制
     */
    void execInstance(Long instanceId, Map<String, Object> args) throws FlowAuthorityException;
 
     /**
     * 获取流程定义process服务
     *
     */
    ProcessService process();
 
    /**
     * 获取流程实例服务
     *
     */
    InstanceService instance();
 
    /**
     * 获取任务节点服务
     *
     */
    TaskService task();
}

② 流程定义服务。

主要是针对流程定义模板的创建和发布,可以根据具体的实现类来支持不同的创建方式。

public interface ProcessService {  
   /**
     * 创建流程定义模板
     *
     */
    void create(String definition);
 
   /**
     * 发布流程定义模板
     *
     */
    void deploy(String fileName);
 
    /**
     * 获取流程key对应的流程定义
     */
    FlowProcess getProcessByDefKey(String processDefKey);
}

③ 流程实例服务。

提供流程实例创建持久化和流程实例执行的入口。

public interface InstanceService {
    /**
     * 创建流程实例
     *
     */
    FlowInstance createInstance(FlowProcess process, Map<String, Object> args);
 
    /**
     * 执行流程实例
     *
     * @param instanceId 流程实例id
     */
    void exec(Long instanceId);
 
    /**
     * 根据id获取流程实例
     *
     * @param instanceId
     * @return
     */
    FlowInstance getById(Long instanceId);
}

④ 流程任务节点服务。

提供流程节点具体每个任务的创建和查询。

public interface TaskService {
 
    /**
     * 根据任务模型、执行对象创建新的任务
     *
     */
    FlowTask createTask(TaskModel taskModel, Execution execution);
 
    /**
     * 完成任务
     *
     */
    FlowTask complete(Long taskId,  Map<String, Object> args);
 
    /**
     * 获取流程实例中正在进行的任务
     *
     */
    FlowTask getActiveTask(Long instanceId);
 
    /**
     * 获取流程实例上一个已完成的任务
     *
     */
    FlowHistTask getLastDoneTask(Long instanceId);
}

其中核心的方法 就是

FlowEngine#startInstanceByKey,启动流程实例。基于流程定义,创建一个流程实例对象。

FlowEngine#execInstance,执行流程实例任务,通过传入的上下文参数(操作人,操作变量等),按照流程定义的节点任务,推进流程实例的自动流转。

4.4 思考和扩展

  1. 流程定义解析性能。

    由于目前设计是在应用启动时对所有的流程定义文件进行加载和解析,流程定义文件过多时会影响应用启动速度,可以通过多线程解析和懒加载(使用时解析)两种方式进行优化。

  2. 流程定义版本兼容性。

    由于业务流程不是一成不变的,在项目发展过程中会不断进行迭代,需要对前面不同的流程进行兼容。

  3. 流程节点插件化和编排能力

    将基础服务进行提取公用,以支持绘制不同流程的插件化和编排能力。

  4. 流程执行监控能力。

    对流程任务节点执行情况进行埋点上报,系统自动进行监测告警。

五、总结

本文分析了引入工作流引擎的背景,驱使业务逻辑从控制流中剥离出来,让产研团队更聚焦于业务,解决研发效率低的问题。

工作流的本质思想是通过预定义的工作流程模板,对现实活动进行实例化的过程。一般需要具备流程可视化、业务可编排复用、 业务和控制分离的基本能力。一般常见的工作流分为顺序工作流、状态机工作流和规则驱动工作流,开源工作流框架中最常见的是状态机工作流,利用事件驱动的方式,驱使流程运转。

同时简单介绍了业界比较流行的几种开源工作流引擎的特点,结合开源工作流引擎的特点的问题,并且针对多样化和迭代频繁的业务流程, 以工作流的本质思想为出发点,我们自研了一套轻量级的工作流引擎,分享了在实践过程中的设计思路和总结思考。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

caf4cea8e6d1ef1f1dca56184f54664d.png

已在知识星球更新源码解析如下:

22a3ca8aca72cc42d112702af739f0ed.jpeg

f57e0d459f81826d3a2778dba1f90f1d.jpeg

93de3294b9a7cb9b85b530dc9b786df9.jpeg

0661af98cebc9f4f0202fa5505727cfd.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
驰骋工作流引擎研发于2003年,具有.net与java两个版本,它们代码结构、数据库结构、设计思想、功能组成、操作手册完全相同。流程表单模版两个版本完全通用。 CCFlow是.net版本的简称,由济南团队负责研发。JFlow是在java版本的简称,由深圳研发团队研发。两款产品核心代码向社会100%开源,十多年来,我们一直践行自己的诺言,努力提高产品质量,真心服务中国IT产业,成为了国内知名的老牌工作流引擎,在国内开源BPM领域稳坐第一位。 CCFlow基础功能: 1、流程引擎设计支持所见即所得的设计:节点设计、表单设计、单据设计、报表定义设计,方向条件设计... 2、流程模式简洁只有4种容易理解、线性流程、同表单分合流、异表单分合流、父子流程,没有复杂的概念。 3、支持流程的基础功能:前进、后退、转向、转发、撤销、抄送、挂起、草稿、任务池共享,也支持高级功能取回审批、项目组、来宾用户等等。 4、支持sdk开发,多表单展现,字段权限控制,从表控制,多种符合中国国情的业务规则设置。 5、表单引擎与流程引擎可以分开也可以单独使用,流程引擎可以驱动表单引擎,实现多种业务数据的操作,比如:汇总、分合、填写。 6、CCFlow集成方式简洁,容易实现插件模式的开发。 7、SDK接口丰富,注释详细, 丰富的帮助文档, 容易上手。 8、更多的功能请参考官方网站。 CCFlow特点: 1、CCFlow成长于中国2003年,历史长久,在多种生产、管理环境中成长起来,是国内老牌的工作流程引擎,拥有众多的爱好者,开发者, 100%的核心代码开源。 2、历经多个项目多种行业磨练(请参考官方网站成功案例),规则丰富,生命力强,绝大多数应用可以实现无代码流程设计。 3、CCFlow的核心代码都是公司自己研发的,核心算法也是基于实际应用,经过我们十多年的发展,每个所服务的客户都能得到最佳的流程解决方案。 4、CCFlow没有借助第3方的流程软件,拥有独立知识产权, 所以我们最容易扩展,实现客户的需求。 5、CCFlow功能强大,可配置性好,通常的应用开发可以实现无代码实现,面向业务人员、系统管理员、与程序员。 6、使用开源的软件好处众多,可以跟踪调试,可以修改,研究者众多,容易得到帮助,可以与我们的开发人员在线互动,遇到问题可以在第1时间解决。 7、CCFlow是国内第一款同时拥有.net版本与java版本的工作流引擎,两者互为影子版本,数据库解构,配置界面完全相同。 8、CCFlow设计思路精巧、概念简单。只有线性、同表单分合流、异表单分合流、父子流程四个概念。 有涵盖多种行为的5*5的算法,流程模式实现现实生活中绝大多数模式(目前没有我们解决不了的问题)。 9、CCFlow的概念简洁、通俗易懂, 运行规则与运行模式清晰,数据库结构设计精简,规则丰富,帮助详实。 10、CCFlow是国内流程引擎与表单引擎集成较好的bpm软件,流程引擎可以操纵表单引擎数据实现复杂的业务数据处理与权限控制。 11、CCFlow拥有200多个流程演示模版,涵盖了我们在开发过程中遇到的很多的应用场景,参考这些模版,容易获得帮助。 12、CCFlow拥有40多个单元测试案例,这些单元测试案例,是保障ccflow稳定运行的基础,在核心代码修改后容易找打问题。 13、CCFlow资料完善(约:16万字),拥有众多的爱好者,开发者容易得到帮助。 CCFlow的代码放在Git上,容易修改代码与我们合并。 14、CCFlow集成方便, 概念、名词通俗易懂。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值