什么是工作流引擎
工作流引擎(Workflow Engine / Process Engine)是一种用于定义、执行和管理业务流程的中间件。它把业务逻辑从代码中剥离出来,用流程图(或规则配置)来描述"下一步该做什么、由谁来做、满足什么条件才能流转",从而让业务流程可配置、可追踪、可审计。
典型应用场景:
- 审批流:请假、报销、合同会签
- 订单流转:下单 → 支付 → 发货 → 收货 → 售后
- 任务编排:复杂的多步骤业务处理链路
- 规则驱动的路由决策
主流引擎一览
工作流引擎大致分两类:
- BPMN 流程引擎:遵循 BPMN 2.0 标准,配套可视化设计器,偏重人工审批、流程管理
- 轻量规则流引擎:不依赖 BPMN,以组件编排为核心,更适合纯代码驱动的业务链路
jBPM
jBPM 是 Java 工作流引擎的"鼻祖",由 Red Hat(JBoss)维护,历史最悠久。
特点:
- 与 Drools(规则引擎)深度集成,适合流程 + 规则组合的场景
- 提供 KIE Workbench 可视化管理平台
- 技术栈较重,学习曲线陡峭
- 社区活跃度不如 Flowable,国内使用较少
适用场景: 已有 Red Hat/JBoss 技术栈,或需要流程与 Drools 规则引擎联动。
Activiti
官网:https://www.activiti.org
仓库:https://github.com/Activiti/Activiti
Activiti 是国内使用最广泛的开源 BPMN 流程引擎,诞生于 2010 年,由 Alfresco 公司主导,核心开发者来自 jBPM。
两次分叉的历史背景:
Activiti 先后分叉出两个重要项目,但背景不同:
- 2013 年 → Camunda:Camunda GmbH 是一家德国咨询公司,是 Activiti 的重度用户和贡献者。他们认为 Alfresco 把 Activiti 的方向带偏向自家内容管理产品,而非纯粹的 BPM 引擎,于是 fork 出去自己做。属于重度外部贡献者对产品方向不满,单独出走。
- 2016 年 → Flowable:Activiti 的几位核心开发者(Joram Barrez、Tijs Rademakers 等,即写 Activiti 的那批人)与 Alfresco 产生分歧后集体离职,直接把 Activiti 5 的代码 fork 出来建了 Flowable。属于亲生父母带着孩子出走,另起门户。Flowable 与 Activiti API 高度兼容、表结构完全兼容,正是因为是同一批人写的,相当于"原版续集"。
特点:
- 完整支持 BPMN 2.0 标准,包含任务、网关、事件、子流程等元素
- 内置 REST API,配套 Activiti Modeler 可视化设计器
- 与 Spring/Spring Boot 集成成熟,提供
activiti-spring-boot-starter - 表结构清晰(
ACT_前缀),流程实例、任务、历史数据分表存储 - 两次分叉后核心人才流失,Alfresco 维护惰性增加,社区活跃度持续下降
适用场景: 传统企业 OA、审批流、已有 Activiti 存量项目维护。
快速依赖(Spring Boot):
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M6</version>
</dependency>
Flowable
官网:https://www.flowable.com
仓库:https://github.com/flowable/flowable-engine
Flowable 是 Activiti 5 的分叉项目,由原 Activiti 核心团队于 2016 年创立,目前维护更积极。
特点:
- 完整兼容 Activiti 5 的流程定义和数据库表结构,迁移成本低
- 除 BPMN 外,还支持 CMMN(案例管理)和 DMN(决策表)
- 提供商业版 Flowable Work,含拖拽设计器、监控面板、多租户
- 开源版功能完整,Spring Boot Starter 开箱即用
- 性能优于 Activiti 6,bug 修复更及时
适用场景: 新项目首选 BPMN 引擎,或从 Activiti 迁移升级。
快速依赖(Spring Boot):
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>7.0.0</version>
</dependency>
Camunda
官网:https://camunda.com
仓库:https://github.com/camunda/camunda-bpm-platform
Camunda 源自 Activiti,由 Camunda GmbH 于 2013 年 fork,先后推出两个架构完全不同的版本:Camunda 7(基于关系型数据库的嵌入式引擎)和 Camunda 8(基于 Zeebe 的云原生分布式引擎),两者 API 不兼容。
Camunda 7 特点:
- 完整支持 BPMN 2.0、CMMN、DMN
- 提供功能强大的 Cockpit(监控)、Tasklist(任务处理)、Admin(权限管理)Web 应用
- 支持嵌入式(embedded)和独立服务(standalone REST)两种部署模式
- 商业支持完善,国内使用相对较少
适用场景: 对流程监控和合规要求较高、需要开箱即用 Web 管理界面的企业。
Camunda 8 (Zeebe)
官网:https://camunda.com/platform/
仓库:https://github.com/camunda/camunda
Camunda 8 于 2022 年发布,核心引擎 Zeebe 从零重写,与 Camunda 7 架构完全不同,API 不兼容。
与 Camunda 7 的根本区别:
| Camunda 7 | Camunda 8 (Zeebe) | |
|---|---|---|
| 运行方式 | 嵌入式 / 独立服务 | 独立分布式集群(不可嵌入) |
| 存储 | 关系型数据库(MySQL/PG) | 事件溯源 + Elasticsearch |
| 扩展方式 | 垂直扩展 | 水平分区扩展 |
| 通信协议 | Java API / REST | gRPC |
| 升级兼容 | — | 与 v7 API 不兼容 |
架构图:
flowchart LR
A[App 任意语言] --gRPC--> B[Zeebe Broker Cluster]
B --> C[Elasticsearch / OpenSearch]
C --> D[Operate 流程监控]
C --> E[Tasklist 任务处理]
特点:
- Zeebe Broker 基于 Raft 一致性协议,分区(Partition)机制,高吞吐低延迟
- Worker 模型:应用注册 Job Worker,Broker 推送任务,天然解耦
- 语言无关:Worker 通过 gRPC 与 Broker 通信,官方提供 Java/Go 客户端,社区有 Python(
pyzeebe)、Node.js、C# 等客户端 - 官方 Helm Chart,部署到 EKS / GKE / AKS 开箱即用
- 提供 Camunda SaaS(全托管版),免运维集群
- 历史数据导出到 Elasticsearch,可对接 AWS OpenSearch Service
Spring Boot 集成(spring-zeebe):
@JobWorker(type = "payment")
public void handlePayment(ActivatedJob job) {
Map<String, Object> vars = job.getVariablesAsMap();
// 处理业务逻辑,完成后自动 complete
}
适用场景: 大规模云原生、跑在 K8s(EKS)上的微服务架构、需要水平扩展的高吞吐流程场景。
LiteFlow
官网:https://liteflow.cc
仓库:https://github.com/dromara/liteflow
LiteFlow 是国产轻量级规则流引擎,隶属 Dromara 开源社区,近年来在国内迅速流行。
特点:
- 不基于 BPMN,用自研的 EL 表达式语言(Chain EL)描述流程,例如:
THEN(a, b, WHEN(c, d), e) - 以"组件"为最小单元,每个节点是一个独立的
@LiteflowComponent - 支持串行、并行、条件分支、循环、子流程等编排方式
- 流程规则支持从数据库、Nacos、Zookeeper 等动态加载,热更新无需重启
- 无可视化设计器(社区有第三方实现),纯代码 / 配置驱动
- 与 Spring Boot 集成极简,引入 starter 即可使用
适用场景: 业务编排(非审批流)、替代大量 if/else 的复杂业务逻辑、需要动态热更新规则的场景。
快速依赖(Spring Boot):
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring-boot-starter</artifactId>
<version>2.12.4</version>
</dependency>
示例组件:
@LiteflowComponent("a")
public class ACmp extends NodeComponent {
@Override
public void process() {
// 业务逻辑
System.out.println("执行组件 A");
}
}
示例规则(chain.xml):
<chain name="main">
THEN(a, b, WHEN(c, d), e);
</chain>
AWS Step Functions
AWS Step Functions 是 AWS 的全托管工作流编排服务,不是 Java 引擎,而是云原生工作流平台。Java 应用通过 AWS SDK 与之交互。
特点:
- 完全托管,无需运维引擎,按执行次数计费
- 用 Amazon States Language(ASL,JSON/YAML) 定义流程状态机
- 与 Lambda、ECS、SQS、SNS、DynamoDB、API Gateway 原生集成,IAM 鉴权
- 两种工作流模式:
- Standard Workflow:exactly-once 语义,最长支持 1 年,适合长流程审批
- Express Workflow:高吞吐(10 万+次/秒),at-least-once,最长 5 分钟
- 控制台提供可视化执行历史和状态图
- 语言无关:Lambda 函数、ECS Task、Activity Worker 均可用任意语言实现;
boto3提供 Python 完整支持
Java 应用启动执行:
StartExecutionRequest request = StartExecutionRequest.builder()
.stateMachineArn("arn:aws:states:us-east-1:123456789:stateMachine:OrderFlow")
.input("{\"orderId\": \"12345\"}")
.build();
sfnClient.startExecution(request);
Lambda 函数(Java)作为流程节点:
public class PaymentHandler implements RequestHandler<Map<String, Object>, Map<String, Object>> {
@Override
public Map<String, Object> handleRequest(Map<String, Object> input, Context context) {
// 处理支付逻辑,返回结果传给下一个状态
return Map.of("paymentStatus", "SUCCESS");
}
}
适合场景: 已重度使用 AWS、需要与 Lambda/ECS 编排、不想自维护流程引擎的团队。
不适合场景: 需要 BPMN 可视化设计器、不在 AWS 上部署、需要人工审批 UI 的场景。
Python 生态
Camunda 8 和 Step Functions 作为独立部署的服务,通过网络协议(gRPC / HTTP)与工作节点通信,天然支持任意语言接入。嵌入式引擎(Flowable、Activiti、jBPM、LiteFlow)则只能跑在 JVM 上。
Python 生态中也有对应的原生引擎可供选择:
| 引擎 | 定位 | 特点 |
|---|---|---|
| SpiffWorkflow | BPMN 2.0 引擎 | 纯 Python,直接执行 BPMN XML,最接近 Flowable/Camunda 7 定位 |
| Temporal | 分布式工作流 | 多语言 SDK(Python/Java/Go/TS),高可靠长流程,理念与 Camunda 8 相近 |
| Apache Airflow | DAG 任务编排 | 最流行,主要用于数据管道;无人工任务节点,不适合审批流 |
| Prefect / Dagster | 数据编排 | 现代化 Python 优先,适合数据工程,不适合业务审批流 |
Camunda 8 + Python
社区提供 pyzeebe 客户端(pip install pyzeebe),与 Java Worker 等价:
from pyzeebe import ZeebeWorker, create_insecure_channel
channel = create_insecure_channel(grpc_address="localhost:26500")
worker = ZeebeWorker(channel)
@worker.task(
task_type="payment",
exception_handler=lambda e, j, c: c.set_failure_status(j, str(e))
)
async def handle_payment(order_id: str):
# 处理支付逻辑
return {"payment_status": "completed"}
AWS Step Functions + Python
boto3 完整支持,Lambda 函数可直接用 Python 实现:
import boto3
# 启动流程
client = boto3.client("stepfunctions", region_name="us-east-1")
client.start_execution(
stateMachineArn="arn:aws:states:us-east-1:123456789:stateMachine:OrderFlow",
input='{"orderId": "12345"}'
)
Python Lambda 作为流程节点:
def handler(event, context):
order_id = event["orderId"]
# 返回结果传给下一个状态
return {"paymentStatus": "SUCCESS"}
发展时间线
timeline
title 工作流引擎发展时间线
2006 : jBPM 诞生
: Red Hat / JBoss 主导
2010 : Activiti 5.x 发布
: Alfresco 公司,核心团队来自 jBPM
2013 : Camunda 从 Activiti 分叉
: 定位企业级 BPM
2016 : Flowable 从 Activiti 5 分叉
: 由原 Activiti 核心团队创立
2020 : LiteFlow 发布
: 国产轻量规则流,Dromara 社区
2022 : Camunda 8 发布
: 基于 Zeebe,支持云原生水平扩展
横向对比
以下重点比较当前推荐的四个方向:
| 维度 | Flowable | Camunda 8 (Zeebe) | Temporal | AWS Step Functions |
|---|---|---|---|---|
| 标准协议 | BPMN/CMMN/DMN | BPMN 2.0 | 代码定义(SDK) | ASL (JSON) |
| 审批流支持 | ✅ 强 | ✅ 强 | ✅ 可实现 | ✅ Standard |
| 可视化设计器 | ✅ 商业更佳 | ✅ Operate | ✅ Temporal UI | ✅ AWS 控制台 |
| 水平扩展 | ❌ | ✅ 原生 | ✅ 原生 | ✅ 全托管 |
| 动态热更新 | ❌ | ❌ | ❌ | ❌ |
| 嵌入式部署 | ✅ | ❌ | ❌ | ❌ |
| 多语言支持 | ❌ Java 专属 | ✅ gRPC 任意语言 | ✅ 官方多语言 SDK | ✅ Lambda 任意语言 |
| 流程定义方式 | BPMN XML | BPMN XML | 纯代码(Workflow 类) | JSON/YAML |
| 国内社区活跃度 | 高 | 低 | 低 | 低 |
| 学习成本 | 中 | 高 | 中 | 中(AWS 生态) |
| 适合场景 | 审批流/新项目 | 云原生/K8s | 高可靠长流程/微服务编排 | AWS 原生编排 |
如何选型
flowchart TD
A[新项目] --> B{部署平台}
B -- 非 AWS / 自建 --> C{业务是否涉及
人工审批?}
B -- AWS 重度用户 --> D{是否需要
BPMN 流程引擎?}
C -- 是 --> E{规模要求}
C -- 否 --> F[LiteFlow
业务编排、替代 if/else
支持动态热更新]
E -- 普通规模 --> G[Flowable
国内生态最佳
上手快]
E -- 云原生大规模 --> H[Camunda 8 Zeebe
EKS 水平扩展
高吞吐]
E -- 存量 Activiti --> I[继续 Activiti
或迁移到 Flowable]
D -- 是 --> H
D -- 否 --> J[AWS Step Functions
全托管、Lambda/ECS 原生集成
无需维护引擎]
Flowable 与 LiteFlow 可共存:用 Flowable 管审批流,用 LiteFlow 编排内部业务逻辑。
在 AWS 上跑 EKS 且有高并发流程需求,Camunda 8 的历史数据可直接对接 AWS OpenSearch Service;如果团队更倾向 AWS 原生服务则选 Step Functions。