1 什么是流程引擎

流程引擎是一个底层支撑渠道,是为供给流程处理而开发规划的。流程引擎和流程运用,以及运用程序的联系如下图所示。

流程引擎的架构设计

常见的支撑场景有:Workflow、BPM、流程编列等。本次共享,首要从BPM流程引擎切入,介绍流程引擎的架构规划办法。

1.1 什么是流程

简单来说,流程就是一系列活动的组合。比方,用于企业工作的OA体系中,就存在很多的请求批阅类的流程。在生产制作业,有很多的从销售端的订单,到生产制作,再到签回收款的生产销售流程。在机器学习范畴,有亚马逊AWS Sagemaker的大数据处理、机器学习的运用。综上,流程是一个概念,在和详细完结结合时,就产生了不同的流程产品,如DevOps、Spring Data Stream等。
在流程完结方面,首要能够分为2种完结办法,一种是用代码完结,比方:用代码完结一个加班请求,那么就要自己对接SSO进行单点登录,经过接口拿到建议人和批阅人的信息,一起保存表单数据。另一种办法是运用流程引擎来完结,流程引擎对接运用场景所需数据,如加班请求,流程引擎对接SSO、OU、批阅人装备、权限等,完结这样一个流程,只需求关怀流程装备、流程节点和流程表单即可,流程流通以及流程的数据处理,都经过流程引擎来完结。
流程引擎能够快速落地流程完结,这也是流程引擎存在的价值。

1.2 什么是引擎

一般来说,引擎是一个程序或一套体系的支撑部分。常见的程序引擎有游戏引擎、搜索引擎、杀毒引擎等。引擎是脱离详细事务场景的某一类事务场景的高度笼统和封装。
比方,某OA公司,封装了一套批阅用的workflow,实施人员只需求装备流程和表单即可交付项目。再比方,美国某公司做了一个AI引擎做NBA(Next Best Action)引荐,封装了引荐范畴的常用算法,在不同的场景主动选择和组合多种算法,进行智能引荐。

1.3 流程规划器

流程规划器是流程和引擎的连接方,用户经过流程规划器,将某种layout和rule固化成某种流程,然后经过数据和数据上下文,运用流程引擎主动依照某种固化的流程进行履行。
我将现在见到的流程规划器的理论基础,分为以下三类:1,自定义系;2,UML中的活动图系;3,BPMN系。

1.3.1 自定义系

用于Sagemaker等场景的AWS Step Function(自定义流程节点)

流程引擎的架构设计

1.3.2 UML Activity Diagram

Flowportal BPM的流程规划器

流程引擎的架构设计

1.3.3 BPMN系

activiti的流程规划器

流程引擎的架构设计

炎黄盈动的流程规划器

流程引擎的架构设计

题外话:炎黄盈动的流程规划器,和processon中的流程规划器界面简直相同,因为本质上是一家的。

2 流程引擎的运用

2.1 Workflow

工作流办理联盟(Workflow Management Coalition,WfMC)作为工作流办理的标准化安排而成立。
WfMC对工作流给出定义为:工作流是指一类能够完全主动履行的运营进程,依据一系列进程规矩,将文档、信息或使命在不同的履行者之间进行传递与履行。

流程引擎的架构设计

在workflow中,流程引擎首要用于支撑流程批阅和数据流通,运用场景十分广泛。
国外产品(开源或商用)通常需求和操作比较简单,不会有国内的需求那么杂乱。国内的产品,阅历了众多客户的锤炼,功用现在都比较强大。
一般来说,workflow运用场景最多的是OA产品。在OA工作中,包括了企业工作中的很多元素,这些元素满足构成特定的产品,比方门户体系、移动工作。在OA的项目落地进程中,结合职业、事务侧重点又能够构成职业处理计划和专题计划。
以下是某OA公司产品和处理计划。

流程引擎的架构设计

2.2 BPM(Business Process Management)

Workflow首要是处理批阅和数据流通,而BPM首要是处理端到端、信息孤岛等问题而存在的。大多数用BPM产品的客户,都是在BPM基础上进行体系建立,比方在BPM上面建立OA、CRM、HR等体系。
BPM的运用场景,比Workflow更广泛,BPM产品中包括很多的和第三方体系交互的组件和自定义SQL、代码组件。比方,BPM体系中的文件触发器,能够在海关等交互场景下,经过监控FTP服务器中的文件,主动触发流程实例;能够经过定时器Timer,主动每日履行数据同步,并经过Mail节点将同步成果告诉到相关运营成员等。

流程引擎的架构设计

流程引擎的架构设计

BPM的运用,能够依照履行前、履行中和履行后来划分。

流程引擎的架构设计

2.3 流程编列

流程编列是脱离流程事务范畴的更高一层笼统,运用方能够经过流程编列体系,结合自己的事务场景进行事务定制。比方,能够将相关事务代码,封装成function,然后经过云厂商渠道的FAAS渠道,将不同事务的function进行相关和调度,从而完结某项使命。

3 流程引擎的架构规划

鉴于一些朋友可能没有运用和触摸过流程引擎,先介绍流程引擎的组成单元,再介绍根据某个BPM产品的项目是怎么进行开发的。咱们经过BPM项目开发,对流程引擎的作用有个开始的知道。

3.1 BPM流程引擎的组成单元

  1. 安排、人物、用户、成员的安排架构托管;
  2. 流程资源文件的装备、校验、存储和履行,对不同的流程节点,流程引擎主动结合装备、数据处理其对应的事务逻辑,流程数据主动处理;
  3. 表单装备、数据绑定,表单数据的依据流程装备主动处理;
  4. 通用的数据接口;

3.1.1 安排架构的规划

流程引擎的架构设计

3.1.2 流程规划器

流程规划器包括左边的分组节点列表,和右侧的画布。左边的节点能够如下进行规划。

流程引擎的架构设计

问题:关于一个XML或JSON格式的流程图,怎么进行解析?
不同的节点,依照不同的事务场景,装备不同的装备项。比方,关于Human Node需求装备批阅人,装备批阅环节的展示表单,批阅环节能够修正哪些字段,哪些字段的修正要进行留痕等。

3.1.3 表单规划器

流程引擎的架构设计

流程引擎的架构设计

这种是依照表单相关数据表,生成出一个表单,然后对表单字段进行装备和数据绑定。

流程引擎的架构设计

流程引擎的架构设计

这种是Drag&Drop控件,然后装备控件的特点,如绑定字段等。

流程引擎的架构设计

这种是Drag&Drop控件,无需相关数据库表字段的表单

流程引擎的架构设计

数据表生成表单的概要流程如下图所示。

流程引擎的架构设计

拖拽控件绑定数据表字段的概要流程如下。

流程引擎的架构设计

拖拽控件无需绑定数据表字段的概要流程。运用NoSQL的Document记载或运用RDS供给的JSON类型进行保存会比较便利。

流程引擎的架构设计

3.1.4 接口规划

结合Activity的接口规划,如下图所示

流程引擎的架构设计

一些体系在创立一个流程使命的时分,要先依照流程模板先创立一个运用示例,再相关建议人和备注,调用RuntimeService,履行到StartNode,这类规划因人而异,这么做略显繁琐。

3.2 根据流程引擎的项目开发实践

3.2.1 流程项目实践流程

  1. 确认安排架构
  2. 确认流程,包括流程布局、批阅人设置、权限
  3. 确认表单信息(字段、类型、数据源、校验规矩)和表单款式
  4. 确认页面布局、款式、数据字段、搜索、导入、导出
  5. 报表

3.2.2 安排架构

安排架构完结,有两种办法,一种是依照维度进行数据办理,另一种是在同一棵安排架构树下进行办理。
依照集团、公司、部分、用户等不同维度,进行数据办理,比较常见,这儿不做讨论。下图为按维度保护数据的示例。

流程引擎的架构设计

依照同一棵安排架构树进行数据保护,界面一般显现为左树右表。大多数商业化产品,都会将此安排架构树进行内存缓存,以便利批阅人查找、开窗选择OrgUnit、Role、User、Member等场景。Member的引进是为了处理一人多职等场景。一般建议流程的时分,需求带出建议人具有的Member列表,从而后续节点取适宜的批阅人。

流程引擎的架构设计

关于安排架构而言,需求考虑,体系自身要具有OU存储的才能,关于没有安排架构的用户,能够直接在体系的安排架构中新建安排架构。一起,关于已有体系的客户,能够经过安排架构数据同步来进行数据主动保护。关于用AD域内部管控的客户来说,需求具有AD域身份认证的才能。关于杂乱场景,比方用户是SaaS化等杂乱场景,安排架构也需求在体系内部,支撑运用API的办法来获取安排信息。
所以在安排架构规划的时分,要运用插件的办法来做,详细运用哪种插件,能够在装备文件中进行装备。以下为一个商业产品的安排架构操作界面示例。

流程引擎的架构设计

常见的安排架构操作还有安排架构同步,比方流程体系同步微信企业号、钉钉等,这儿不再打开。

3.2.3 流程规划

咱们幻想的流程,可能是向下面的这种简单流程。

流程引擎的架构设计

而实践项目,碰到的流程,一般是如下图所示的情景。

流程引擎的架构设计

开始看几个流程的模型文件是什么样的,先有个印象。

流程引擎的架构设计

<?xml version="1.0" encoding="UTF-8" ?>
<definitions id="definitions"
targetNamespace="http://activiti.org/bpmn20"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:activiti="http://activiti.org/bpmn">
<process id="vacationRequest" name="Vacation request">
<startEvent id="request" activiti:initiator="employeeName">
<extensionElements>
<activiti:formProperty id="numberOfDays" name="Number of days" type="long" value="1" required="true"/>
<activiti:formProperty id="startDate" name="First day of holiday (dd-MM-yyy)" datePattern="dd-MM-yyyy hh:mm" type="date" required="true" />
<activiti:formProperty id="vacationMotivation" name="Motivation" type="string" />
</extensionElements>
</startEvent>
<sequenceFlow id="flow1" sourceRef="request" targetRef="handleRequest" />
<userTask id="handleRequest" name="Handle vacation request" >
<documentation>
${employeeName} would like to take ${numberOfDays} day(s) of vacation (Motivation: ${vacationMotivation}).
</documentation>
<extensionElements>
<activiti:formProperty id="vacationApproved" name="Do you approve this vacation" type="enum" required="true">
<activiti:value id="true" name="Approve" />
<activiti:value id="false" name="Reject" />
</activiti:formProperty>
<activiti:formProperty id="managerMotivation" name="Motivation" type="string" />
</extensionElements>
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>management</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
<sequenceFlow id="flow2" sourceRef="handleRequest" targetRef="requestApprovedDecision" />
<exclusiveGateway id="requestApprovedDecision" name="Request approved?" />
<sequenceFlow id="flow3" sourceRef="requestApprovedDecision" targetRef="sendApprovalMail">
<conditionExpression xsi:type="tFormalExpression">${vacationApproved == 'true'}</conditionExpression>
</sequenceFlow>
<task id="sendApprovalMail" name="Send confirmation e-mail" />
<sequenceFlow id="flow4" sourceRef="sendApprovalMail" targetRef="theEnd1" />
<endEvent id="theEnd1" />
<sequenceFlow id="flow5" sourceRef="requestApprovedDecision" targetRef="adjustVacationRequestTask">
<conditionExpression xsi:type="tFormalExpression">${vacationApproved == 'false'}</conditionExpression>
</sequenceFlow>
<userTask id="adjustVacationRequestTask" name="Adjust vacation request">
<documentation>
Your manager has disapproved your vacation request for ${numberOfDays} days.
Reason: ${managerMotivation}
</documentation>
<extensionElements>
<activiti:formProperty id="numberOfDays" name="Number of days" value="${numberOfDays}" type="long" required="true"/>
<activiti:formProperty id="startDate" name="First day of holiday (dd-MM-yyy)" value="${startDate}" datePattern="dd-MM-yyyy hh:mm" type="date" required="true" />
<activiti:formProperty id="vacationMotivation" name="Motivation" value="${vacationMotivation}" type="string" />
<activiti:formProperty id="resendRequest" name="Resend vacation request to manager?" type="enum" required="true">
<activiti:value id="true" name="Yes" />
<activiti:value id="false" name="No" />
</activiti:formProperty>
</extensionElements>
<humanPerformer>
<resourceAssignmentExpression>
<formalExpression>${employeeName}</formalExpression>
</resourceAssignmentExpression>
</humanPerformer>
</userTask>
<sequenceFlow id="flow6" sourceRef="adjustVacationRequestTask" targetRef="resendRequestDecision" />
<exclusiveGateway id="resendRequestDecision" name="Resend request?" />
<sequenceFlow id="flow7" sourceRef="resendRequestDecision" targetRef="handleRequest">
<conditionExpression xsi:type="tFormalExpression">${resendRequest == 'true'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow8" sourceRef="resendRequestDecision" targetRef="theEnd2">
<conditionExpression xsi:type="tFormalExpression">${resendRequest == 'false'}</conditionExpression>
</sequenceFlow>
<endEvent id="theEnd2" />
</process>
</definitions>

一个屏幕截图都截不完的流程,假如用代码去完结整个流程,其工作量和效率,可想而知。而实践做项目,运用根据流程引擎的产品来做项目的时分,只需求确认节点、节点装备、数据装备和权限即可。
问题:一般流程,都带有邮件告诉的节点,怎么完结邮件告诉节点?请考虑以下情景。
流程流通和履行的时分,会遇到各种情况的过错,比方找不到批阅人等,此时流程引擎要对数据做rollback,而邮件告诉节点的事务逻辑已经履行过了。

权限方面,关于流程资源,哪些部分能够请求,哪些人物不行请求,都应该做流程控制。而在流程履行进程中,流程数据、不是旅程的相关人也都不应该看到流程,处理过流程的批阅人,不能够再对流程进行处理等,都是权限方面要考虑的问题。

3.2.4 表单规划

如下图所示的表单,能够剖析以下,一个流程表单有多个主表信息和多个子表信息。一般来说,假如是经过流程引擎做非流程的数据处理,子表经过主表ID来做相关,假如经过流程引擎做流程的数据处理,子表和主表经过TaskId来做相关。以下为示例。

流程引擎的架构设计

流程体系需求表单规划器,一个流程的不同节点能够挂接不同的表单,以便利不同人物的人关注不同维度的流程信息

3.2.5 页面规划

一般来说,关于流程的建议、批阅、历史记载等,都是通用的体系界面。而一些事务场景,需求独自做列表界面,以便利运用。关于已有门户体系的客户,需求融合其界面款式。以下为从前做过的项目示例。

流程引擎的架构设计

流程引擎的架构设计

3.2.6 报表

因为不是所有客户都有报表体系,所以流程体系需求具有一个基本的报表功用。下图为示例。

流程引擎的架构设计

有报表体系的客户,能够运用其商业版报表体系,获取(直接取、数仓)数据进行展示。常见的报表体系有FineReport、Tableau、PowerBI等。

3.3 BPM流程引擎架构规划

3.3.1 流程引擎的架构规划

流程引擎的架构设计

3.3.2 建议流程

流程引擎的架构设计

流程引擎处理进程

流程引擎的架构设计

履行节点处理进程

流程引擎的架构设计

问题:在流程引擎处理进程中,假如一个节点有多条连线,怎么寻找FromNodeId是某个Node的连线?
人工处理时,指定连线text

3.4 流程引擎架构规划

流程引擎的架构设计

3.4.1 事务辨认

  1. 辨认事务场景中的装备项,运用调集或分组的办法,让事务可装备
  2. 支撑事务流程进程的可装备化
  3. 支撑事务场景中的数据,主动处理

3.4.2 流程引擎的完结

  1. 资源相关服务,资源加载,资源保存,资源加密等
  2. 装备项相关服务
  3. PVM虚拟机的完结,即经过某个节点(建议时为开始节点)作为初始节点,依照某个连线的action进行节点的主动履行的虚拟机
  4. 数据装备、数据权限
  5. 流程数据和事务数据的主动处理

4 商业时机

  1. Business Process Analysis (BPA) 流程剖析,帮助企业进行流程调整和优化

  2. Process Assets Library(PAL)流程资产库,对企业流程进行知识化沉淀,将制度和流程落地做绑定,让批阅人知晓流程中对应的责任

  3. Process Simulate 流程模拟,主动化测验

  4. Process Forecast 流程预测

  5. 低代码渠道

  6. 更广泛的时机,在于事务范畴+流程引擎,比方:DevOps、RPA、运用与服务编列、数据编列、FaaS编列等。

作者:马瑞