工作流引擎架构设计

2023-01-12 00:00:00 开源 节点 引擎 流程 工作流

近开发的安全管理平台新增了很多工单申请流程需求,比如加白申请,开通申请等等。开始的两个需求,为了方便,也没多想,就直接开发了对应的业务代码。

但随着同类需求不断增多,感觉再这样写可要累死人,于是开始了工作流引擎的开发之路。查找了一些资料之后,开发了现阶段的工作流引擎,文章后面会有介绍。

虽然现在基本上能满足日常的需求,但感觉还不够智能,还有很多的优化空间,所以正好借此机会,详细了解了一些完善的工作流引擎框架,以及在架构设计上需要注意的点,形成了这篇文章,分享给大家。

什么是工作流

先看一下维基百科对于工作流的定义:

工作流(Workflow),是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。工作流建模,即将工作流程中的工作如何前后组织在一起的逻辑和规则,在计算机中以恰当的模型表达并对其实施计算。

工作流要解决的主要问题是:为实现某个业务目标,利用计算机在多个参与者之间按某种预定规则自动传递文档、信息或者任务。

简单来说,工作流就是对业务的流程化抽象。WFMC(工作流程管理联盟) 给出了工作流参考模型如下:

举一个例子,比如公司办公的 OA 系统,就存在大量的申请审批流程。而在处理这些流程时,如果每一个流程都对应一套代码,显然是不现实的,这样会造成很大程度上的代码冗余,而且开发工作量也会骤增。

这个时候就需要一个业务无关的,高度抽象和封装的引擎来统一处理。通过这个引擎,可以灵活配置工作流程,并且可以自动化的根据配置进行状态变更和流程流转,这就是工作流引擎。

简单的工作流

那么,一个工作流引擎需要支持哪些功能呢?

这个问题并没有一个标准答案,需要根据实际的业务场景和需求来分析。在这里,我通过一个工单流程的演进,从简单到复杂,循序渐进地介绍一下都需要包含哪些基础功能。

简单流程

简单的一个流程工单,申请人发起流程,每个节点审批人逐个审批,终流程结束。

会签

在这个过程中,节点分成了两大类:简单节点和复杂节点。

简单节点处理逻辑不变,依然是处理完之后自动到下一个节点。复杂节点比如说会签节点,则不同,需要其下的所有子节点都处理完成,才能到下一个节点。

并行

同样属于复杂节点,其任何一个子节点处理完成后,都可以进入到下一个节点。

条件判断

需要根据不同的表单内容进入不同的分支流程。

举一个例子,比如在进行休假申请时,请假一天需要直属领导审批,如果大于三天则需要部门领导审批。

动态审批人

审批节点的审批人需要动态获取,并且可配置。

审批人的获取方式可以分以下几种:

  1. 固定审批人
  2. 从申请表单中获取
  3. 根据组织架构,动态获取
  4. 从配置的角色组或者权限组中获取

撤销和驳回

节点状态变更可以有申请人撤回,审批人同意,审批人驳回。那么在驳回时,可以直接驳回到开始节点,流程结束,也可以到上一个节点。更复杂一些,甚至可以到前面流程的任意一个节点。

自动化节点

有一些节点是不需要人工参与的,比如说联动其他系统自动处理,或者审批节点有时间限制,超时自动失效。

个性化通知

节点审批之后,可以配置不同的通知方式来通知相关人。

以上是我列举的一些比较常见的需求点,还有像加签,代理,脚本执行等功能,如果都实现的话,应该会是一个庞大的工作量。当然了,如果目标是做一个商业化产品的话,功能还是需要更丰富一些的。

但把这些常见需求点都实现的话,应该基本可以满足大部分的需求了,至少对于我们系统的工单流程来说,目前是可以满足的。

工作流引擎对比

既然这是一个常见的需求,那么需要我们自己来开发吗?市面上有开源项目可以使用吗?

答案是肯定的,目前,市场上比较有名的开源流程引擎有 Osworkflow、Jbpm、Activiti、Flowable、Camunda 等等。其中:Jbpm、Activiti、Flowable、Camunda 四个框架同宗同源,祖先都是 Jbpm4,开发者只要用过其中一个框架,基本上就会用其它三个了。

Osworkflow

Osworkflow 是一个轻量化的流程引擎,基于状态机机制,数据库表很少。Osworkflow 提供的工作流构成元素有:步骤(step)、条件(conditions)、循环(loops)、分支(spilts)、合并(joins)等,但不支持会签、跳转、退回、加签等这些操作,需要自己扩展开发,有一定难度。

如果流程比较简单,Osworkflow 是一个很不错的选择。

JBPM

JBPM 由 JBoss 公司开发,目前高版本是 JPBM7,不过从 JBPM5 开始已经跟之前不是同一个产品了,JBPM5 的代码基础不是 JBPM4,而是从 Drools Flow 重新开始的。基于 Drools Flow 技术在国内市场上用的很少,所有不建议选择 JBPM5 以后版本。

JBPM4 诞生的比较早,后来 JBPM4 创建者 Tom Baeyens 离开 JBoss,加入 Alfresco 后很快推出了新的基于 JBPM4 的开源工作流系统 Activiti,另外 JBPM 以 hibernate 作为数据持久化 ORM 也已不是主流技术。

Activiti

Activiti 由 Alfresco 软件开发,目前高版本 Activiti7。Activiti 的版本比较复杂,有 Activiti5、Activiti6、Activiti7 几个主流版本,选型时让人晕头转向,有必要先了解一下 Activiti 这几个版本的发展历史。

Activiti5 和 Activiti6 的核心 leader 是 Tijs Rademakers,由于团队内部分歧,在 2017 年 Tijs Rademakers 离开团队,创建了后来的 Flowable。Activiti6 以及 Activiti5 代码已经交接给了 Salaboy 团队,Activiti6 以及 Activiti5 的代码官方已经暂停维护了。

Salaboy 团队目前在开发 Activiti7 框架,Activiti7 内核使用的还是 Activiti6,并没有为引擎注入更多的新特性,只是在 Activiti 之外的上层封装了一些应用。

Flowable

Flowable 是一个使用 Java 编写的轻量级业务流程引擎,使用 Apache V2 license 协议开源。2016 年 10 月,Activiti 工作流引擎的主要开发者离开 Alfresco 公司并在 Activiti 分支基础上开启了 Flowable 开源项目。基于 Activiti v6 beta4 发布的个 Flowable release 版本为 6.0。

Flowable 项目中包括 BPMN(Business Process Model and Notation)引擎、CMMN(Case Management Model and Notation)引擎、DMN(Decision Model and Notation)引擎、表单引擎(Form Engine)等模块。

相对开源版,其商业版的功能会更强大。以 Flowable6.4.1 版本为分水岭,大力发展其商业版产品,开源版本维护不及时,部分功能已经不再开源版发布,比如表单生成器(表单引擎)、历史数据同步至其他数据源、ES 等。

Camunda

Camunda 基于 Activiti5,所以其保留了 PVM,新版本 Camunda7.15,保持每年发布两个小版本的节奏,开发团队也是从 Activiti 中分裂出来的,发展轨迹与 Flowable 相似,同时也提供了商业版,不过对于一般企业应用,开源版本也足够了。

以上就是每个项目的一个大概介绍,接下来主要对比一下 Jbpm、Activiti、Flowable 和 Camunda。只看文字的话可能对它们之间的关系还不是很清楚,所以我画了一张图,可以更清晰地体现每个项目的发展轨迹。

那么,如果想要选择其中一个项目来使用的话,应该如何选择呢?我罗列了几项我比较关注的点,做了一张对比表格,如下:

Activiti 7Flowable 6CamundaJBPM 7
流程协议BPMN2.0、XPDL、PDLBPMN2.0、XPDL、XPDLBPMN2.0、XPDL、XPDLBPMN2.0
开源情况开源商业和开源版商业和开源版开源
开发基础JBPM4Activiti 5 & 6Activiti 5版本 5 之后 Drools Flow
数据库Oracle、SQL Server、MySQLOracle、SQL Server、MySQL、postgreOracle、SQL Server、MySQL、postgreMySQL,postgre
架构spring boot 2spring boot 1.5spring boot 2Kie
运行模式独立运行和内嵌独立运行和内嵌独立运行和内嵌-
流程设计器AngularJSAngularJSbpmn.js-
活跃度活跃相对活跃相对活跃-
表数量引入 25 张表引入 47 张表引入 19 张表-
jar 包数量引入 10 个 jar引入 37 个 jar引入 15 个 jar-

相关文章