架构设计-流程引擎的架构设计

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 流程引擎的组成单元

  • 组织、角色、用户、成员的组织架构托管;
  • 流程资源文件的配置、校验、存储和执行,对不同的流程节点,流程引擎自动结合配置、数据处理其对应的业务逻辑,流程数据自动处理;
  • 表单配置、数据绑定,表单数据的根据流程配置自动处理;
  • 通用的数据接口;
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 流程项目实践流程
  • 确定组织架构
  • 确定流程,包括流程布局、审批人设置、权限
  • 确定表单信息(字段、类型、数据源、校验规则)和表单样式
  • 确定页面布局、样式、数据字段、搜索、导入、导出
  • 报表
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 业务识别
  • 识别业务场景中的配置项,使用集合或分组的方式,让业务可配置
  • 支撑业务流程过程的可配置化
  • 支撑业务场景中的数据,自动处理
3.4.2 流程引擎的实现
  • 资源相关服务,资源加载,资源保存,资源加密等
  • 配置项相关服务
  • PVM 虚拟机的实现,即通过某个节点(发起时为开始节点)作为初始节点,按照某个连线的 action 进行节点的自动执行的虚拟机
  • 数据配置、数据权限
  • 流程数据和业务数据的自动处理

4、商业机会

  • Business Process Analysis (BPA) 流程分析,帮助企业进行流程调整和优化
  • Process Assets Library(PAL)流程资产库,对企业流程进行知识化沉淀,将制度和流程落地做绑定,让审批人知晓流程中对应的职责
  • Process Simulate 流程模拟,自动化测试
  • Process Forecast 流程预测
  • 低代码平台
  • 更广泛的机会,在于业务领域 + 流程引擎,比如:DevOps、RPA、应用与服务编排、数据编排、FaaS 编排等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/825656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端】3. CSS【万字长文】

CSS 是什么 层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离. CSS 就是 “东方四大邪术” 之化妆术. 基本语法规范 选择器 {一条/N条声明} 选择器决定针对谁修改 (找谁)声明决…

钉钉直播回放怎么下载到本地

钉钉直播回放如何下载到本地,本文就给大家解密如何下载到本地 工具我已经给大家打包好了 钉钉直播回放下载软件链接&#xff1a;https://pan.baidu.com/s/1_4NZLfENDxswI2ANsQVvpw?pwd1234 提取码&#xff1a;1234 --来自百度网盘超级会员V10的分享 1.首先解压好我给大家…

【Qt】Qt Hello World 程序

文章目录 1、Qt Hello World 程序1.1 使用按钮实现1.1.1 使用可视化方式实现 1.1.2 纯代码方式实现 label创建堆&#xff08;内存泄漏&#xff09;或者栈问题Qt基础类&#xff08;Qstring、Qvector、Qlist&#xff09;乱码问题零散知识 1、Qt Hello World 程序 1.1 使用按钮实…

Swin Transformer 浅析

Swin Transformer 浅析 文章目录 Swin Transformer 浅析引言Swin Transformer 的网络结构W-MSA 窗口多头注意力机制SW-MSA 滑动窗口多头注意力机制Patch Merging 图块合并 引言 因为ViT无法实现CNN中的层次化构建以及局部信息&#xff0c;由此微软团队提出了Swin Transformer来…

C语言(二维数组)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

15.7 2011年42题真题讲解

2&#xff0c;4&#xff0c;6&#xff0c;8&#xff0c;11&#xff0c;13&#xff0c;15&#xff0c;17&#xff0c;19&#xff0c;20 可以推出题目的一个隐含条件&#xff1a;偶数个元素的中位数是靠前的那一个 应试技巧&#xff1a;如果实在想不出高效的算法&#xff0c;那…

基于springboot+vue+Mysql的房产销售平台

开发语言&#xff1a;Java框架&#xff1a;springcloudJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a…

【详细讲解CentOS常用的命令】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

SQLite FTS5 扩展(三十)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite的知名用户(二十九) 下一篇&#xff1a;SQLite—系列文章目录 1. FTS5概述 FTS5 是一个 SQLite 虚拟表模块&#xff0c;它为数据库应用程序提供全文搜索功能。在最基本的形式中&#xff0c; 全文搜索引擎允许用户有…

Dinov2 + Faiss 图片检索

MetaAI 通过开源 DINOv2&#xff0c;在计算机视觉领域取得了一个显着的里程碑&#xff0c;这是一个在包含1.42 亿张图像的令人印象深刻的数据集上训练的模型。产生适用于图像级视觉任务&#xff08;图像分类、实例检索、视频理解&#xff09;以及像素级视觉任务&#xff08;深度…

【leetcode面试经典150题】57. 环形链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

vivado 使用 JTAG-to-AXI Master 调试核进行硬件系统通信

使用 JTAG-to-AXI Master 调试核进行硬件系统通信 JTAG-to-AXI Master 调试核为可自定义核 &#xff0c; 可在运行时生成 AXI 传输事务并驱动 FPGA 内部的 AXI 信号。该核支持所 有存储器映射型 AXI 接口和 AXI4-Lite 接口 &#xff0c; 并且可支持位宽为 32 或 64 …

免费的数据恢复软件有哪些?推荐10款免费的数据恢复软件!

通过使用功能强大的免费和最好的数据恢复软件&#xff0c;您可以取消删除重要文件和文档。丢失文件是每个人在许多情况下面临的常见问题&#xff0c;这些数据恢复程序可以充当完美的救星。 我们编制了 2024年的最佳软件列表。这些工具易于使用&#xff0c;您可以通过如何在 PC…

Spring Boot 目前还是最先进的吗?

当谈到现代Java开发框架时&#xff0c;Spring Boot一直处于领先地位。它目前不仅是最先进的&#xff0c;而且在Java生态系统中拥有着巨大的影响力。 1. 什么是Spring Boot&#xff1f; Spring Boot是由Spring团队开发的开源框架&#xff0c;旨在简化基于Spring的应用程序的开…

接收区块链的CCF会议--ICSOC 2024 截止7.24

ICSOC是CCF B类会议&#xff08;软件工程/系统软件/程序设计语言&#xff09; 2023年长文短文录用率22% Focus Area 4: Emerging Technologies Quantum Service Computing Digital Twins 3D Printing/additive Manufacturing Techniques Blockchain Robotic Process Autom…

N元语言模型

第1关&#xff1a;预测句子概率 任务描述 本关任务&#xff1a;利用二元语言模型计算句子的概率 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.条件概率计算方式。 2.二元语言模型相关知识。 条件概率计算公式 条件概率是指事件A在事件B发生的条件下发…

【MySQL探索之旅】多表查询

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

【数学】推荐一种用尺规绘制正五边形,简单而又精确的作法

【说明】 正五边形的尺规作图方法很多&#xff0c;但大多比较繁琐&#xff0c;下面介绍一种作法&#xff0c;这种方法步骤少&#xff0c;简便易行。 【具体步骤】 1.作相互垂直的两条直线&#xff0c;交点为O&#xff1b; 2.以O为圆心作圆&#xff0c;交横线与AB两点&#…

风速Weibull分布和光伏Beta分布的参数拟合方法(含matlab算例)

在风光场景生成、随机优化调度等研究中&#xff0c;常常假设风速服从Weibull分布&#xff0c;太阳辐照度服从Beta分布。那我们如何得到两个分布的参数呢&#xff1f;文本首先介绍了风速Weibull分布和辐照度Beta分布的基本概率模型及其性性质&#xff0c;之后以MATLAB代码为例阐…

读所罗门的密码笔记21_读后总结与感想兼导读

1. 基本信息 所罗门的密码&#xff1a;AI时代的价值、权力与信任 Solomons Code 奥拉夫格罗思 马克尼兹伯格 著 中信出版社,2022年5月出版 1.1. 读薄率 书籍总字数257千字&#xff0c;笔记总字数37780字。 读薄率37780257000≈14.7% 1.2. 读厚方向 千脑智能 脑机穿越 …