flowable工作流架构分析

news2024/12/24 21:38:57

flowable工作流

  • 目录
    • 概述
      • 需求:
    • 设计思路
    • 实现思路分析
      • 1.复杂的状态的或者状态的维度增加的状的条件极为复杂
      • 2.工作流
      • 3.BPMN2.0协议
      • 4.协议的元素
      • 5.互斥网关
      • 包容性网关(Inclusive Gateway)
  • 参考资料和推荐阅读

Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.

目录

在这里插入图片描述

概述

工作流,是把业务之间的各个步骤以及规则进行抽象和概括性的描述。使用特定的语言为业务流程建模,让其运行在计算机上,并让计算机进行计算和推动。

需求:

工作流是复杂版本的状态机。
上图为工作流退化为基础状态机的例子,小明的状态非常简单,站立->走路->跑步->走路->站立,无限循环,如果让我们实现小明的状态切换,那么我们只需要用一个字段来记录小明当前的状态就好了。

设计思路

实现思路分析

1.复杂的状态的或者状态的维度增加的状的条件极为复杂

而对于复杂的状态或者状态维度增加且状态流转的条件极为复杂,可能单纯用字段记录状态的实现方式就会不那么理想。

2.工作流

工作流解决的痛点在于,解除业务宏观流程和微观逻辑的耦合,让熟悉宏观业务流程的人去制定整套流转逻辑,而让专业的人只需要关心他们应当关心的流程节点,就好比大家要一起修建一座超级体育场,路人甲只需要关心他身边的这一堆砖是怎么堆砌而非整座建筑。

3.BPMN2.0协议

对于业务建模,我们需要一种通用的语言来描绘,这样在沟通上和实现上会降低难度,就像中文、英文一样,BPMN2.0便是一种国际通用的建模语言,他能让自然人轻松阅读,更能被计算机所解析。

4.协议的元素

协议中元素的主要分类为,事件-任务-连线-网关。
一个流程必须包含一个事件(如:开始事件)和至少一个结束(事件)。其中网关的作用是流程流转逻辑的控制。任务则分很多类型,他们各司其职,所有节点均由连线联系起来。

5.互斥网关

又称排他网关,他有且仅有一个有效出口,可以理解为if…else if… else if…else,就和我们平时写代码的一样。

包容性网关(Inclusive Gateway)

包容性网关(Inclusive Gateway),只要满足条件的出口都会执行,可以理解为 if(…) do, if (…) do, if (…) do,所有的条件判断都是同级别的。

BPMN2.0协议的所有任务其实是从一个抽象任务派生而来的,抽象任务会有如下行为:

当流程流转到该任务时,应该做些什么?

当该任务获得信号(signal)的时候,它是否可以继续向下流转,而任务获得信号的这个动作我们称为Trigger。
利用如上的抽象行为,我们来解释一些比较常见且具有代表性的任务类型。

人工任务(User Task)它是使用得做多的一种任务类型,他自带有一些人工任务的变量
例如签收人(Assignee),签收人就代表该任务交由谁处理,我们也可以通过某个特定或一系列特定的签收人来查找待办任务。

利用上面的行为解释便是,当到达User Task节点的时候,节点设置Assignee变量或等待设置Assignee变量,当任务被完成的时候,我们使用Trigger来要求流程引擎退出该任务,继续流转。

服务任务(Service Task),该任务会在到达的时候执行一段自动的逻辑并自动流转。从“到达自动执行一段逻辑”这里我们就可以发现,服务任务的想象空间就可以非常大,我们可以执行一段计算,执行发送邮件,执行RPC调用,而使用最广泛的则为HTTP调用,因为HTTP是使用最广泛的协议之一,它可以解决大部分第三方调用问题,在我们的使用中,HTTP服务任务也被我们单独剥离出来作为一个特殊任务节点。

接受任务(Receive Task),该任务的名字让人费解,但它又是最简单的一种任务,当该任务到达的时候,它不做任何逻辑,而是被动地等待Trigger,它的适用场景往往是一些不明确的阻塞,比如:一个复杂的计算需要等待很多条件,这些条件是需要人为来判断是否可以执行,而不是直接执行,这个时候,工作人员如果判断可以继续了,那么就Trigger一下使其流转。

调用活动(Call Activity),调用活动可以理解为函数调用,它会引用另外一个流程使之作为子流程运行,调用活动跟函数调用的功能一样,使流程模块化,增加复用的可能性。

这里是一个生产汽车的流程,从“汽车设计”节点到“批准生产”节点是一个串行的任务,而审批的结果会遇到一个互斥网关,上面讲过,互斥网关只需要满足其中一个条件就会流转,而这里表达的意义就是审批是否通过。“载入图纸”是一个服务任务,它是自动执行的,之后会卡在“等待原材料”这个节点,因为这个节点是需要人为去判断(比如原材料涨价,原材料不足等因素),所以需要在一种自定义的条件下Trigger,而该图的条件应该为“原材料足够”,原材料足够之后,我们会开始并行生产汽车零件。

需要注意的是,并行网关在图中是成对出现的,他的作用是开始一系列并行任务和等待并行任务一起完成,拿一个Java中的东西举例子,就是CountDownLatch,fork-join模型也可以类比。
网关的本质其实是计数器和出口逻辑的混合,它跟其他节点没什么区别,只是他的推动逻辑需要使他的计数器为0,而计数器的总数为网关入口线段的数量,比如“组装”节点前面的并行网关,他的计数器就为4,而前面4个节点,每完成一个就会触发该网关计数器-1。

当计数器为0的时候,网关会触发选择后续流转的逻辑。
互斥网关的逻辑为:遍历所有出口连线,满足条件则流出并打断(也就是break掉)。

并行网关的逻辑为:遍历所有出口连线,无条件为所有连线流出。
包容性网关的逻辑为:遍历所有出口连线,满足条件的就流出。

Flowable是BPMN2.0协议的一种Java版本的实现。
Flowable项目提供了一组核心的开源业务流程引擎,这些引擎紧凑且高效。它们为开发人员、系统管理员和业务用户提供了一个工作流和业务流程管理(BPM)平台。它的核心是一个非常快速且经过测试的动态BPMN流程引擎。它基于Apache2.0开源协议,有稳定且经过认证的社区。

Flowable可以嵌入Java应用程序中运行,也可以作为服务器、集群运行,更可以提供云服务。
目前主流的工作流开源框架就是Activiti/Camunda/Flowable,它们都有一个共同的祖先jbpm。先是有了jbpm4,随后出来了一个Activiti5,Activiti5经过一段时间的发展,核心人员出现分歧,又分出来了一个Camunda。activiti5发展了4年左右,紧接着就出现了Flowable。

而Activiti则只着重于处理bpmn,它的方向在于云,他的设计会尽量像例如Spring Cloud、Docker、K8S靠拢。
如果你单纯地想快速上手bpmn引擎,建议使用Activiti,如果你想做出花样繁多的工作流引擎,建议使用Flowable。

而Camunda(卡蒙达)则更加的轻巧灵活,他的初衷就是为开发人员设计的“小工具”,但我个人的感觉而言,Camunda从代码上看并没有Activiti和Flowable好,而且他的社区是最不活跃的一个(至少从国内的角度来看),所以不太建议使用(当然这带了很多个人主观感受,如有不同意见,欢迎讨论)。
在这里插入图片描述

从架构图中可以看出,Flowable对于数据的处理是冷热分离的,热数据存在ACT_RU_系列表中,历史冷数据存在ACT_HI_系列表中,定义相关的存在ACT_RE_系列表中,而对于在途和定义相关的数据,有一层缓存,他缓存的具体实现比较复杂。

Flowable开发了新的异步执行器(ASYNC EXECUTOR)

在这里插入图片描述

,异步执行大概分为两类,timer和message,类似于定时事件就是timer,而异步的服务任务则为message。

“Task A”附着的边界定时事件,在时间触发之后,会执行“Escalate”任务,而“Async Service Task”在“Task A”流转之后,会启用一个异步任务去调用其服务。
对于一种全是异步服务任务的极端情况,如上图所示,他常常出现于服务编排之类的场景之中,我们经常性的需要同时处理一系列的任务,这时候异步调度的作用就非常重要。

Flowable也采用了冷热数据分离的思想,他把数据分为了4类,异步Job,定时器Timer,挂起任务,死信队列。通过测试发现,数据库是异步任务性能低下的主要瓶颈,特别是多实例竞争Job会存在潜在的问题。在分表的时候同时加上了一个全局锁,保证了同一个实例只能由一个实例去获取并锁定job(job表中有字段会被update,内容为抢占到的实例代号),这样反而能提升不少性能。为了保证各个实例不被饿死,还调整了一系列参数。
在这里插入图片描述

Flowable提供了一个更加优化的冷热数据分离方案,在数据敏感性比较高的领域,我们一般会把引擎的历史记录级别调到最高(包括流程流转历史、变量变动历史、签收人变动历史等等),这些历史记录在以前是在同一个上下文中执行的,虽然在最开始设计的时候,在途数据和历史数据就冷热分离了,但从权衡在途和历史的重要性的角度来讲,历史其实不是最重要的,所以Flowable提供一系列的方法使历史记录这个行为异步化,与之对应的方法可以是jms,rabbitMQ或Spring Boot listener application。

这个改动可以提升在途流程效率20%-96%。

云上的工作流应该关心什么
我如何把我的业务逻辑转化为流程图-即容易理解的绘图工具。
我如何使流程流转-即开箱即用的API。
我需要引擎告诉我,我现在该处理什么节点-即丰富且鲜明的事件机制。

图中是流程图的整个生命周期,从画图到部署,然后启动流程,流程经过人工或自动的方式流转,最后结束。

还有一些费解的属性,比如,排他、同步异步、相对的,我们只保留一些常见的节点类型,就如前面介绍的:用户任务、服务任务、互斥网关、并行网关等。

而开箱即用的API就需要我们尽量减少API的复杂度和个数,把API分类为以下三类比较合适。
流程定义类-负责流程定义的查看
流程实例类-负责流程实例的查看与操作

而对于“我现在该处理什么节点”的问题,我们提供了一种解决方案。
在这里插入图片描述

用户的角色可以分为三类逻辑,第一、和工作流沟通的逻辑,它负责启动流程和通知流程的流转,
第二类为服务提供者,即工作流不能提供的服务,需要第三方或业务方自己计算结果,比如:支付接口。
第三类为消息处理逻辑,这里的消息大概为任务的创建,任务的签收,任务的完成,流程的创建,流程的结束等等,处理消息的角色可以根据自己的职责处理不同的任务类型或流程类型。
用户的角色可以分为三类逻辑,第一、和工作流沟通的逻辑,它负责启动流程和通知流程的流转,第二类为服务提供者,即工作流不能提供的服务,需要第三方或业务方自己计算结果,比如:支付接口。第三类为消息处理逻辑,这里的消息大概为任务的创建,任务的签收,任务的完成,流程的创建,流程的结束等等,处理消息的角色可以根据自己的职责处理不同的任务类型或流程类型。

这样区分的好处在于,如果有一个流程图,他的流程涉及到不同系统甚至是不同部门之间的合作,我们不可能让所有部门都去关心整个流程,甚至有些部门根本不知道工作流的存在,他们所关心的。

参考资料和推荐阅读

  1. https://zhuanlan.zhihu.com/p/417014073

欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~

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

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

相关文章

车载以太网 - DoIP诊断消息处理逻辑 - 05

前面我们已经介绍了DoIP信息头部处理逻辑和路由激活处理,那根据DoIP报文的顺序,在路由激活处理完成后,接下来我们就需要发送真正的DoIP诊断信息了,那今天我们就来介绍下DoIP诊断消息的处理逻辑。 诊断消息处理逻辑 DoIP诊断报文结构: 上面表格对于DoIP诊断报文的…

Android 11 SystemUI(状态/导航栏)-图标按键的深浅色

概述 自 Android 5.0 版本,Android 带来了沉浸式系统 bar(状态栏和导航栏),Android 的视觉效果进一步提高,各大 app 厂商也在大多数场景上使用沉浸式效果。6.0开始提供了View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR标志位&a…

MVC架构模式 | 使用银行转账的功能实现引出MVC架构模式

一、银行转账的功能实现数据库表的准备创建数据库表&#xff0c;主要包括三个字段&#xff1a;自增的id、账户名、账户余额不使用MVC架构模式完成账户转账首先写一个页面&#xff0c;写入转账的账户和金额&#xff1b;并发送post请求<% page contentType"text/html;cha…

【JavaEE】进入Web开发的世界-HTML

目录 一、HTML 1.1概念篇 1.2工具篇 1.2.1文本类型的标签 1.2.2多媒体标签 1.2.3超链接 1.2.4target 1.2.5表格相关的标签 1.2.6 列表标签 1.2.7表单标签 进入Web开发的世界&#xff0c;了解html、css、JavaScript的使用。 Web开发的核心&#xff1a;准备各式各样的资…

元壤:国内首家免费的数字藏品、DAO数字化营销SaaS平台

元壤&#xff1a;国内首家免费的数字藏品、DAO数字化营销SaaS平台 元壤是 Web3.0 时代 NFT 数字藏品与用户服务的数字化工具。元壤是中国企业数字资产化及数字藏品营销解决方案提供商。元壤致力于通过产品和服务,助力企业资产数字化,数字营销化,通过科技驱动数字商业变革,让数…

如何仿真MOS电容的电压-电容曲线?

一、原理 电容的阻抗为&#xff1a; 假设在电容两端施加频率为 f 的小信号电压 v &#xff0c;电容上流过的小信号电流为 i &#xff0c;那么三者有如下关系&#xff1a; 二、仿真 设置频率为1/2pi&#xff0c;这样算出来斜率即为1/C。设置f为0.159155 斜率就是1/C&#xff0c…

你问我答|DDR5对企业用户意味着什么?

自从2014年DDR4内存在市场推出以来,时间已经过去了八年,这对日新月异的计算机行业来说,无疑是相当长的一段时间了。这期间,更快的CPU和存储介质等产品的技术进步,促进了对更大容量的内存、更高内存带宽和更快速率的需求,服务器市场尤其如此。      而在2023年,我们终于迎来…

Sentinel 初始化监控以及流控规则简介

Sentinel 初始化监控 第一步&#xff1a;创建8401微服务 cloudalibaba-sentinel-service 并引入依赖 .yml 配置文件 server:port: 8401spring:application:name: cloudalibaba-sentinel-servicecloud:nacos:server-addr: localhost:8848 #Nacos服务注册中心地址sentinel:trans…

抖音搜索里的百科词条如何创建?

头条系的两大拳头产品&#xff0c;一个是抖音&#xff0c;一个是今日头条。现在头条系的运营重心向抖音倾斜&#xff0c;而抖音搜索里也存在一个固定的位置给快懂百科&#xff0c;这个位置不是像短视频一样滚动更新&#xff0c;做抖音搜索优化的话&#xff0c;小马识途营销顾问…

gateway网关的使用

今天与大家分享gateway网关的使用 1. gateway简介 1.1 是什么 SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关&#xff0c;目标是替代 Zuul&#xff0c;在Spring Cloud 2.0以上版本中&#xff0c;没有对新版本的Zuul 2.0以上最新高性能版本进行集成&#xff0c;仍…

Java设计模式中外观模式是什么/外观模式有什么用,如何实现

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 5.6 外观模式 5.6.1 概述 又称门面模式&#xff0c;通过为多个子系统提供一个一致接口&#xff0c;而使这些子系统更加容易被访问的模式对外有一个统一接口&…

SAP工作流规则

代理人规则获取部分&#xff0c;灵活工作流和传统工作流一致 1. 事务代码&#xff1a;PFAC&#xff0c;用来创建规则 2. 规则用来确定代理&#xff0c;可通过如下下拉框中多种方式确定代理人 责任可在事务代码OOCU_RESP中配置代理人&#xff0c;可用来代替配置表确定代理人的…

Python蓝桥杯训练:数组和字符串 Ⅴ

Python蓝桥杯训练&#xff1a;数组和字符串 Ⅴ 文章目录Python蓝桥杯训练&#xff1a;数组和字符串 Ⅴ一、找到数组的中间位置二、使用最小花费爬楼梯一、找到数组的中间位置 给你一个下标从 0 开始的整数数组 nums &#xff0c;请你找到 最左边 的中间位置 middleIndex &#…

推荐系统实战5——EasyRec 在DSSM召回模型中添加负采样构建CTR点击平台

推荐系统实战5——EasyRec 在DSSM召回模型中添加负采样构建CTR点击平台学习前言EasyRec仓库地址DSSM实现思路一、DSSM整体结构解析二、网络结构解析1、Embedding层的构建2、网络层的构建3、相似度计算三、训练部分解析训练自己的DSSM模型一、数据集的准备二、Config配置文件的设…

一键生成分享链接的贺卡制作工具

不用自己动手设计&#xff0c;在线模板帮你轻松搞定新春贺卡设计&#xff0c;免下载的设计工具。跟着小编的设计教程&#xff0c;教你如何使用乔拓云工具&#xff0c;在线搞定你的新春祝福贺卡设计&#xff0c;不用任何设计经验&#xff0c;只需要跟着教程就能搞定的专属贺卡设…

论文笔记:RCLane: Relay Chain Prediction for Lane Detection

RCLane: Relay Chain Prediction for Lane Detection笔记摘要动机模型结构方法其他模型试验结果笔记摘要 该篇论文的核心创新点在于head。论文根据车道线既需要局部信息&#xff0c;也需要全局信息才能很好拟合的特性&#xff0c;设计了相应的算法head。并且论文实验证明该方法…

机器视觉(十一):条码识别

目录&#xff1a; 机器视觉&#xff08;一&#xff09;&#xff1a;概述 机器视觉&#xff08;二&#xff09;&#xff1a;机器视觉硬件技术 机器视觉&#xff08;三&#xff09;&#xff1a;摄像机标定技术 机器视觉&#xff08;四&#xff09;&#xff1a;空域图像增强 …

记一次虚拟机编译c程序错误

file included from /usr/include/stdio.h:74:0, from opendir.c:2: /usr/include/libio.h:302:3: error: unknown type name ‘size_t’ size_t __pad5; ^ /usr/include/libio.h:305:67: error: ‘size_t’ undeclared here (not in a function) ch…

黑马程序员 Maven 教程

Maven 简介 传统项目管理的缺点&#xff1a; (1) jar 包不统一&#xff0c;jar 包不兼容; (2) 工程升级维护过程操作繁琐; Maven 是什么 Maven 的本质是一个项目管理工具&#xff0c;将项目开发和管理过程抽象成一个项目对象模型 (POM) POM (Project Object Model) : 项目对…

二分搜索算法

目录1.概述2.代码实现2.1.最基本的二分搜索2.2.搜索最左侧边界2.3.搜索最右侧边界3.应用本文参考&#xff1a; LABULADONG 的算法网站 《大话数据结构》 1.概述 &#xff08;1&#xff09;二分搜索 (Binary Search)&#xff0c;又称为折半搜索 (Half-interval Search)。它的前…