Flowable 简要分析

一、Flowable是什么

Flowable是BPMN2.0协议的一种Java版本的实现。 

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

Flowable可以嵌入Java应用程序中运行,也可以作为服务器、集群运行,更可以提供云服务。 

与大多数故事一样,Flowable也是因为其与Activiti对未来规划的路线不认同而开辟了一条自己的道路。目前主流的工作流开源框架就是Activiti/Camunda/Flowable,它们都有一个共同的祖先jbpm。先是有了jbpm4,随后出来了一个Activiti5,Activiti5经过一段时间的发展,核心人员出现分歧,又分出来了一个Camunda。activiti5发展了4年左右,紧接着就出现了Flowable。 

相比于Activiti,Flowable的核心思想更像是在做一个多彩的工具,它在工作流的基础功能上,提供了很多其他的扩展,使用者可以随心所欲地把Flowable打造成自己想要的样子。例如:Camel节点,Mule节点。他不仅有bpmn引擎,还有cmmn(案例管理模型),dmn(决策模型),content(内容管理),form(表单管理),idm(用户鉴权)等等,但这也间接导致了Flowable的包结构非常繁多,上手非常困难。 

而Activiti则只着重于处理bpmn,它的方向在于云,他的设计会尽量像例如Spring Cloud、Docker、K8S靠拢。 

如果你单纯地想快速上手bpmn引擎,建议使用Activiti,如果你想做出花样繁多的工作流引擎,建议使用Flowable。 

二、核心架构

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

对于协议到运行态的转化,有专门一层Converter来实现,也就是说,如果你想自己定义一些协议外的东西,就需要关心这个部分。

最下面是节点行为层,这个很好理解,对于每种节点,都会有不同的实现,你也可以自定义实现。

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,MQ或Spring Boot listener application。 这个改动可以提升在途流程效率20%-96%。

posted @ 2021-12-01 17:39  晨煦风清  阅读(1439)  评论(1编辑  收藏  举报