开源流程引擎选型 —— Activiti、Flowable、Camunda

目录

一. 前言

二. 主流开源流程引擎介绍

2.1. Osworkflow

2.2. JBPM

2.3. Activiti

2.4. Flowable

2.5. Camunda

三. Flowable 与 Camunda 对比分析

3.1. 功能方面对比

3.2. 性能方面对比

四. 总结


一. 前言

    市场上比较有名的开源流程引擎有 Osworkflow、JBPM、Activiti、Flowable、Camunda。其中,jBPM4、Activiti、Flowable、Camunda 四个框架同宗同源,祖先都是 jBPM4,开发者只要用过其中一个框架,基本上就会用其它三个。

    低代码平台、办公自动化(OA)、BPM 平台、工作流系统均需要流程引擎功能,对于市场上如此多的开源流程引擎,哪个功能和性能好,该如何选型呢?

二. 主流开源流程引擎介绍

2.1. Osworkflow

    Osworkflow 是一个轻量化的流程引擎,基于状态机机制,数据库表很少,Osworkflow 提供的工作流构成元素有:步骤(step)、条件(conditions)、循环(loops)、分支(spilts)、合并(joins)等,但不支持会签、跳转、退回、加签等这些操作,需要自己扩展开发,有一定难度,如果流程比较简单,osworkflow 是很好的选择,但该开源组件已过时,长时间没有版本升级了。

官方网站:http://www.opensymphony.com/osworkflow/。

2.2. JBPM

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

    jBPM4 诞生的比较早,后来 jBPM4 创建者 Tom Baeyens 离开 JBoss 后,加入 Alfresco 后很快推出了新的基于 jBPM4 的开源工作流系统 Activiti,另外 JBPM 以 Hibernate 作为数据持久化 ORM 也已不是主流技术,现在时间节点选择流程引擎,JBPM 不是最佳选择。

官方网站:https://www.jbpm.org/。

2.3. Activiti

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

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

    Activiti6 以及 Activiti5 的代码官方已经暂停维护了,Salaboy 团队目前在开发 Activiti7 框架,Activiti7 内核使用的还是 Activiti6,并没有为引擎注入更多的新特性,只是在 Activiti 之外的上层封装了一些应用。

结论是 Activiti 谨慎选择。

官方网站:https://www.activiti.org/。

2.4. Flowable

    Flowable 基于 Activiti6 衍生出来的版本,Flowable 目前最新版本是 v6.6.0,开发团队是从 Activiti中分裂出来的,修复了一众 Activiti6 的 Bug,并在其基础上研发了 DMN 支持,BPEL 支持等等,相对开源版,其商业版的功能会更强大。

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

    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)等模块。

官方网站:https://flowable.com/open-source/。

2.5. Camunda

    Camunda 基于 activiti5,所以其保留了 PVM,最新版本 Camunda7.15,保持每年发布2个小版本的节奏,开发团队也是从 Activiti 中分裂出来的,发展轨迹与 Flowable 相似,同时也提供了商业版,不过对于一般企业应用,开源版本也足够了,强烈推荐 Camunda 流程引擎,功能和性能表现稳定。

选择 Camunda 的理由:

  1. 通过压力测试验证 Camunda BPMN 引擎性能和稳定性更好。
  2. 功能比较完善,除了 BPMN,Camunda 还支持企业和社区版本中的 CMMN(案例管理)和DMN(决策自动化)。Camunda 不仅带有引擎,还带有非常强大的工具,用于建模,任务管理,操作监控和用户管理,所有这些都是开源的。

官方网站:https://docs.camunda.org/manual/7.15/introduction/。 

三. Flowable 与 Camunda 对比分析

3.1. 功能方面对比

由于 Flowable 与 Camunda 好多功能都是类似的,因此在这里重点罗列差异化的功能:

  • Camunda 支持流程实例的迁移,比如同一个流程有多个实例,多个流程版本,不同流程实例运行在不同的版本中,Camunda 支持任意版本的实例迁移到指定的流程版本中,并可以在迁移的过程中支持从哪个节点开始。
  • Camunda 基于 PVM 技术,所以用户从 Activii5 迁移到 Camunda 基本上毫无差异。Flowable没有 pvm 了,所以迁移工作量很大(实例的迁移,流程定义的迁移、定时器的迁移都非常麻烦)。
  • Camunda 对于每一个 CMD 命令类都提供了权限校验机制,Flowable 没有。
  • Camunda 对于每一个 API 都有批处理的影子,Flowable 几乎没有。比如批量挂起流程、激活流程等,使用 Camunda 可以直接使用 API 操作,使用 Flowable 则只能自己去查询集合,然后循环遍历集合并操作。
  • Camunda 很多 API 均支持批处理,在批量处理的时候可以指定是异步方式操作或者是同步方式操作。异步的话定时器会去执行。Flowable 没有异步批处理的机制。比如批量异步删除所有的历史数据。
  • Camunda 启动实例的时候支持从哪个节点开始,而不是仅仅只能从开始节点运转实例。Flowable 仅仅只能从开始节点运转实例。
  • Camunda 支持任意节点的跳转,可以跳转到连线也可以跳转到节点,并且在跳转的过程中支持是否触发目标节点的监听器。Flowable 没有改原生 API 需用户去扩展。
  • Camunda 支持双异步机制,第一个异步即节点可以异步执行,第二个异步方式是:完成异步任务后,还可以继续异步去执行任务后面的连线。所以称之为双异步机制,Flowable 只有第一种异步方式。
  • Camunda 支持多种脚本语言,这些脚本语言可以在连线上进行条件表达式的配置,开箱即用。比如 python、ruby、groovy、JUEL。Flowable 仅仅支持 JUEL、groovy。开箱即用的意思就是如果想用 python 直接引入 jython 包就可以用了,不需要额外配置。
  • Camunda 支持外部任务,比如我们有时候想在一个节点中执行调用第三方的 API 或者完成一些特定的逻辑操作,就可以使用外部任务,外部任务有两种表,并支持第三方系统定期来抓取并锁定外部任务,然后执行业务完毕之后,完成外部任务,流程实例继续往下执行。外部任务的好处就是解决了分布式事物的问题。在 Flowable 中我们可以使用 httpTask 任务,我个人更倾向于 Camunda 外部任务,因为这个外部任务有外部系统决定什么时候完成,httpTask 是不等待任务,实例走到这个节点之后,调用一个 Api 就直接往下跑了,外部任务不会继续往下跑,有外部系统去决定啥时候往下跑。
  • Camunda 支持为用户定制一些个性化的偏好查找 API,比如张三每次查询任务的时候,一般固定点击某某三个查询条件过滤数据,使用 Camunda 就可以将这三个查询条件进行持久化,下次张三来了,就可以直接根据他的偏好进行数据的过滤,类似机器学习。
  • Camunda 支持历史数据的批量删除或者批量迁移到其他介质,比如批量迁移到 ES,Flowable 没有该机制。
  • Camunda 支持在高并发部署流程的时候,是否使用锁机制,Flowable 没有该机制。
  • Camunda 支持单引擎多组合、多引擎多库。Flowable 仅仅支持单引擎多组合。
  • Camunda 支持流程实例跨流程定义跳转,Flowable 没有该机制。
  • Camunda 支持分布式定时器,Flowable 没有该机制。
  • Flowable 支持 NoSql,Camunda 只有 NoSql 的解决方案。
  • Camunda 支持优化流程,以及了解流程引擎的瓶颈所在和每个环节的耗时,Flowable 没有该机制。
  • Camunda 修改了流程模板 xml 解析方式,相比 Flowable 性能更好。
  • Camunda 在解析流程模板 xml 的时候,去除了 Activiti5 的双解析机制,相对而言耗时时间更短。Flowable 没有了 pvm 所以规避了双解析机制。
  • Camunda 可以在任意节点添加任意的属性,Flowable 原生 API 没有,需要自己扩展。
  • Camunda 框架没有为流程生成图片的 API(所有流程图展示以及高亮均在前端动态计算),Activiti5/6/Flowable5/Flowable6 有图片生成以及高亮的 API.
  • Camunda 可以在节点中定义定时作业的优先级,也可以在流程中进行全局优先级的定义。当节点没有定义优先级的时候可以使用全局的优先级字段。Activiti5/6/Flowable5/Flowable6 没有该功能。
  • Camunda 可以在流程中定义流程的 Tag 标记,Activiti5/6/Flowable5/Flowable6 没有该功能。
  • Camunda/Activiti5/6/Flowable5/Flowable6 均不支持国产数据库,比如人大金仓 和 达梦。
  • Flowable6 支持 LDAP、openLDAP,Camunda 不支持。Activiti5 不支持。

3.2. 性能方面对比

    作者通过 Flowable 和 Camunda 多组对比测试,Camunda 性能比 Flowablet 提升最少10%,最大39%,而且 Camunda 无报错,Flowable 有报错,Camunda 在高并发场景下稳定性更好。

    通过压力测试工具 JMeter(详细参见《JMeter —— 3万字讲解让测试彻底臣服的基于 Java 之强大测试工具》) 分别对 Flowable 和 Camunda 进行高并发压力测试,并发用户数从100到1000,JMeter 设置 Ramp-up 为1,循环次数为10,测试数据如下:

并发数FlowableCamunda

性能对比

(Camunda比Flowable提升)

100并发2269 ms1631 ms+39%
200并发3907 ms3489 ms+12%
400并发7250 ms6452 ms+12%
600并发9943 ms8700 ms+14%
800并发13700 ms12400 ms+10%
1000并发18800 ms15700 ms+20%

测试结论:
    在1000并发时,Flowable6 后台报错,但能执行成功。报错信息为:Caused by:com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction;Camunda 后台无报错,执行全部成功。

    通过 Flowable 和 Camunda 多组对比测试,Camunda 性能比 Flowablet 提升最少10%,最大39%,而且 Camunda无报错,Flowable 有报错,Camunda 在高并发场景下稳定性更好。云程BPM(云程低代码开发平台)基于 Camunda 开发,可以在线体验,并在多个项目进行验证,性能表现良好。

四. 总结

    推荐大家使用 Camunda(流程引擎)+ bpmn-js(流程设计器)组合,作者在公司项目中经过实战验证,Camunda 在功能方面比 Flowable、Activiti 流程引擎强大,性能和稳定性更突出。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【35分钟掌握金融风控策略25】定额策略实战2

目录 基于收入和负债的定额策略 确定托底额度和盖帽额度 确定基础额度 基于客户风险评级确定风险系数 计算最终授信额度 确定授信有效期 基于收入和负债的定额策略 在实际生产中,客户的收入和负债数据大多无法直接获得,对于个人的收入和负债数据&…

LeetCode题目104: 二叉树的最大深度(递归\迭代\层序遍历\尾递归优化\分治法实现 )

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…

【算法】dfs

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、全排列1. 决策树2. 设计代码1. 全局变量2. dfs函数3. 细节问题 二、子集解法一1. 决策树2. 设计代码…

Redis-发布与订阅

发布与订阅 什么是发布与订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 Redis的发布与订阅 客户端订阅频道 当给这个频道发送消息后,消息就会…

英伟达发布AM-RADIO高效视觉基础模型,推理速度提升6倍,性能超CLIP、DINOv2、SAM

前言 近年来,视觉基础模型 (VFM) 在众多下游任务中取得了巨大成功,例如图像分类、目标检测和图像生成等。然而,现有的 VFM 通常专注于特定领域,例如 CLIP 擅长零样本视觉语言理解,DINOv2 擅长语义分割,SAM…

如何在外网访问内网共享文件?

在日常工作和生活中,我们经常会遇到外网访问内网共享文件的需求。我们可能需要远程访问公司内部的共享文件夹,或者与不同地区的合作伙伴共享文件。由于网络安全的限制,外网访问内网的共享文件并不是一件容易的事情。 为了解决这个问题&#x…

matlab使用教程(70)—修改坐标区属性

1.控制坐标轴长度比率和数据单位长度 您可以控制 x 轴、y 轴和 z 轴的相对长度(图框纵横比),也可以控制一个数据单位沿每个轴的相对长度(数据纵横比)。 1.1图框纵横比 图框纵横比是 x 轴、y 轴和 z 轴的相对长度。默认…

C++ | Leetcode C++题解之第86题分隔链表

题目: 题解: class Solution { public:ListNode* partition(ListNode* head, int x) {ListNode* small new ListNode(0);ListNode* smallHead small;ListNode* large new ListNode(0);ListNode* largeHead large;while (head ! nullptr) {if (head-…

前端小技巧:如何自定义网页的右键菜单(如何禁用网页的右键菜单)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 右键菜单设置 📒📝 自定义右键菜单实现步骤📝 示例代码📝 涉及的JavaScript语法和参数📝 禁用特定区域的右键菜单⚓️ 相关链接 ⚓️📖 介绍 📖 在网页设计中,一个直观且个性化的右键菜单可以显著提升用户的交互…

WPS表格:对比少于1万的两列数据

当我们需要对于A、B两列乱序的数据,找出A列中某一项B列有没有,或者找出B列中的某一项A列有没有,都可以先将这两列数据放入WPS表格中: 1.选中C列的第一行的单元格,在函数区输入函数 如果我们以A为基准,找A中…

HR4988内置转换器和过流保护的微特步进电机驱动芯片

描述 HR4988是一款内部集成了译码器的微特步进电机驱动器,能使双极步进电机以全、半、1/4、1/8、1/16步进模式工作。步进模式由逻辑输入管脚MSx选择。其输出驱动能力达到32V和2A。 译码器是HR4988易于使用的关键。通过STEP管脚输入一个脉冲就可以使电机完成一次步进…

软件工程期末复习(4)

软件过程 软件过程是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。 ISO 9000对过程的定义: 使用资源将输入转化为输出的活动所构成的系统。 瀑布模型: 瀑布模型的特点: 阶段间具有顺序性和依赖性 必须…

Docker和Kubernetes之间的关系

Docker和Kubernetes在容器化生态系统中各自扮演着不同的角色 它们之间是互补的,而不是替代关系。 Docker是一个开源的容器化平台,它允许开发人员将应用程序及其依赖项打包到一个可移植的容器中,并确保这些容器可以在任何Docker环境中一致地…

Embedding技术学习

可能很多人并没有关注Embedding技术,但实际上它是GPT非常重要的基础,准备的说,它是GPT模型中理解语言/语义的基础。 【解释什么是Embedding】 对于客观世界,人类通过各种文化产品来表达,比如:语言&#x…

GIAT: 蛋白质结构预测的新利器

瑞典Karolinska研究院在瑞典政府赞助下由Ben Murrell等研究团队在AlphaFold 3最新报告后提出这篇论文提出了一种非常有趣和创新的方法来生成蛋白质骨架结构,称为生成式不变角度转换器(GIAT)。与现有的主要基于扩散模型和流匹配的方法不同,GIAT采用了类似于大型语言模型(如GPT)中…

06-Fortran基础--Fortran模块化编程

06-Fortran基础--Fortran模块化编程 1 模块的定义和使用2 接口和模块间通信3 模块化编程的优势:4 模块使用示例5 结语 Fortran的模块化编程是一种组织和管理代码的方法,它包括模块的定义和使用、接口和模块间通信以及模块化编程的优势。 1 模块的定义和…

【35分钟掌握金融风控策略24】定额策略实战

目录 基于客户风险评级的定额策略 确定托底额度和盖帽额度 确定基础额度 基于客户风险评级确定风险系数 计算最终授信额度 确定授信有效期 基于客户风险评级的定额策略 在开发定额策略时,精准确定客户的基础额度是一个关键步骤,通常会基于客户的收…

基于地平线J6E,「吃蟹者」易航智能重塑高速NOA

作者 |张祥威 编辑 |德新 一批基于地平线J6E的智驾方案将要到来,高速NOA领域很快会变天。 易航智能是这批智驾方案公司中的一家。 近日在北京车展,这家公司推出一套基于地平线J6 E的7V1R方案,可以实现城市记忆领航、高速NOA、记忆泊车、L2…

数据结构---经典链表OJ

乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 点击主页:optimistic_chen和专栏:c语言, 创作不易,大佬们点赞鼓…

C++八股(面试题、手撕题)自用版

目录 面试题: 1. define inline 在编译的哪个阶段 2. const static 3. 子函数返回结构体有什么问题,返回对象调用了哪些函数 4. volatile关键字 5. 编译器基本原理 6. 预处理、编译、汇编、链接以及他们在操作系统上如何运作的 7. 数组和指针&a…