工作流引擎技术方案<初版>
现流行AI工作流引擎技术方案与实现方式调研
n8n
前端技术栈
-
核心流程图库:Vue Flow
-
图形布局引擎:Dagre
-
拖拽功能:Vuedraggable
n8n 的流程图绘制技术栈是:
Vue Flow(核心) + Dagre(布局) + Vuedraggable(拖拽) + Vue 3 Composition API(架构)
后端技术栈
后端代码模块化梳理:https://www.processon.com/v/685b72107dbaf842a9ee9b54?cid=685b6ee53a038f2b261ab950
数据库梳理:https://www.processon.com/v/685ba3a83a444c5346fb296c?cid=685ba058d1eab77979de60f5
核心组件:
-
WorkflowService:流程 CRUD 操作
-
ActiveWorkflowManager:流程激活/停用管理
-
WorkflowRunner:流程执行管理
-
NodeTypes:节点类型管理
数据库支持:
-
SQLite(开发环境)
-
PostgreSQL(生产环境推荐)
-
MySQL/MariaDB(生产环境支持)
技术特点:
-
基于 TypeORM 的 ORM 框架
-
Repository 模式数据访问
-
事件驱动的架构设计
-
依赖注入的模块化设计
-
事务管理确保数据一致性
n8n与BPMN引擎对比
Dify
前端技术栈
后端技术栈
后端代码模块梳理:https://www.processon.com/v/685b966e74aa236c0c49b6b1?cid=685b7292c7884e2e72ba7529
核心需求分析
- 可视化流程绘制界面 (Frontend):用户能够通过拖拽节点、连接线、配置节点属性来设计工作流程。
- 流程定义与存储 (Backend/Persistence):将绘制的流程图转化为可执行的定义(如JSON、XML或DSL),并持久化存储。
- 流程引擎 (Backend Core):能够解析流程定义,驱动流程实例的执行,管理流程状态、任务分配、条件判断、并发、循环等复杂逻辑。
- 任务执行与集成 (Backend/Integration):流程中的节点能够触发具体的业务逻辑,例如:
- 调用知识库的API(查询、创建、更新知识)
- 触发外部服务(发送通知、调用其他微服务)
- 执行自定义代码片段
- 涉及人工审批/任务
- 流程实例管理与监控 (Backend/Frontend):能够查看流程实例的运行状态、历史记录、异常信息。
- 用户和权限管理:与Spring Boot知识库系统的用户体系集成。
技术选型方案
1. 前端可视化流程绘制(核心难点之一)
这是实现“绘制”功能的关键,需要一个强大的流程图库。
- 推荐方案:基于成熟的图绘制库 + 自定义开发
- bpmn.js / dmn.js / cmmn-js (Camunda生态): 如果你后端计划使用Camunda或Flowable,那么前端直接使用它们的配套库是最自然的选择。它们提供了非常专业的BPMN 2.0、DMN、CMMN绘图能力,功能强大且符合标准。
- 优点:高度专业,功能完善,符合行业标准,与后端Camunda/Flowable无缝集成。
- 缺点:学习曲线可能较陡峭,主要围绕BPMN标准,如果你的流程并非严格的BPMN,可能需要自定义扩展。
- GoJS / JointJS / mxGraph (draw.io): 强大的通用图形库,提供了丰富的功能(拖拽、连线、节点、缩放等)。你需要在此基础上自行构建流程节点、属性面板和交互逻辑。
- 优点:高度灵活,可定制性强,不绑定特定后端或标准。
- 缺点:开发量大,需要从零开始设计节点类型、属性配置、数据结构与后端流程定义的映射关系。
- X6 (AntV / G6): 阿里巴巴AntV团队的图可视化引擎,专注于流程图、脑图、拓扑图等。提供了丰富的组件和交互。
- 优点:国产,社区活跃,文档丰富,性能良好,更适合国内开发习惯。
- 缺点:仍需大量自定义开发以实现流程编排的特定功能。
- ProFlow (Ant Design Pro): 如果你的前端使用React和Ant Design,ProFlow提供了一个开箱即用的流程图组件,可以大大减少开发量。
- 优点:基于React,快速构建,与Ant Design生态集成。
- 缺点:通用性不如GoJS等,可能在深度定制上有限制。
- bpmn.js / dmn.js / cmmn-js (Camunda生态): 如果你后端计划使用Camunda或Flowable,那么前端直接使用它们的配套库是最自然的选择。它们提供了非常专业的BPMN 2.0、DMN、CMMN绘图能力,功能强大且符合标准。
- 数据格式选择:前端绘制的流程图需要转换为后端能够识别和执行的数据格式。
- BPMN XML:如果使用Camunda/Flowable,这是标准格式。
- JSON Schema:自定义的JSON结构,可以灵活定义节点类型、属性和连接关系,适合自研或简化流程模型。Dify和n8n很可能使用自定义的JSON格式。
2. 后端流程引擎(核心驱动力)
这是实现“编排”和“自动化”效果的核心。Spring Boot应用需要集成一个流程引擎来管理流程的生命周期。
- 推荐方案1:嵌入式BPMN引擎 (Camunda / Flowable)
- Camunda BPM:
- 优点:
- 成熟稳定:企业级,功能强大,经过广泛验证。
- 标准支持:原生支持BPMN 2.0、CMMN、DMN,符合行业标准。
- 易于集成Spring Boot:Camunda提供了
camunda-bpm-spring-boot-starter
,可以非常方便地将流程引擎嵌入到Spring Boot应用中,自动配置数据源、REST API等。 - 可视化工具:配套的Camunda Modeler和Web Apps(Cockpit, Tasklist)提供强大的管理和监控能力。
- 活跃社区与文档:丰富的资料和社区支持。
- 缺点:可能略重,如果你的流程非常简单,BPMN标准可能显得有些复杂。但考虑到要实现“复杂流程”和“自动化”,它的强大是值得的。
- 实现思路:
- 在Maven/Gradle中引入Camunda Spring Boot Starter依赖。
- 流程定义文件(
.bpmn
)放在src/main/resources/processes
目录下。 - 通过
RuntimeService
,TaskService
等Camunda API与流程进行交互。 - 实现
JavaDelegate
来执行业务逻辑(如调用知识库服务)。 - 前端使用
bpmn.js
进行绘制,然后将BPMN XML提交给Spring Boot后端进行部署。
- 优点:
- Flowable:
- 优点:与Camunda类似,都是Activiti的分支,轻量级,性能好,也很好地支持Spring Boot集成。在某些方面可能比Camunda更轻量级一些。
- 缺点:功能上略逊于Camunda,但对多数场景已足够。
- 实现思路:与Camunda类似。
- Camunda BPM:
- 推荐方案2:自研轻量级引擎 (JSON/DSL解析)
- 优点:
- 极致灵活:完全按照自己的需求定义流程模型和执行逻辑。
- 轻量级:只包含你需要的功能,没有额外负担。
- 缺点:
- 开发量巨大:需要自行实现状态机、任务调度、事件处理、并发控制、错误重试、持久化、版本管理等核心功能,难度极高,且容易出现bug。
- 缺乏标准与生态:没有成熟的可视化工具和通用集成方案。
- 维护成本高:需要长期投入维护和功能迭代。
- 适合场景:除非你的流程需求非常特殊且简单,或者你有足够的开发资源和时间,否则不推荐自研核心引擎。Dify和n8n虽然是“自研”,但它们是专门为此而生的产品,投入了大量精力。
- 优点:
- 推荐方案3:混合模式 (适用于AI原生流程)
- 核心逻辑:使用Spring Boot业务逻辑处理,将复杂决策和AI能力通过OpenAPI/REST API暴露。
- 流程编排:使用一个更高级的编排器来调用这些API。
- Dify (如果可以嵌入或作为独立服务): 如果Dify的后端服务可以作为独立组件运行并通过API与你的知识库系统交互,那么可以考虑使用它来专门处理AI相关的流程。
- LangChain / Semantic Kernel: 如果流程更多是基于LLM的Agentic工作流,可以在Spring Boot中集成LangChain4j (Java版本) 或Semantic Kernel (Java版本)。它们提供了Agent、工具调用、RAG等能力,可以用来构建AI驱动的复杂逻辑。
- 优点:深度融合AI能力,构建Agentic工作流更方便。
- 缺点:不适用于传统的业务流程(如审批、定时任务),更侧重于LLM的编排。
我的建议:对于Spring Boot集成和实现类似“钉钉流程自动化”的通用流程编排,强烈推荐使用 Camunda BPM 作为后端流程引擎。
3. 数据持久化
- 选择:流程引擎通常需要数据库来存储流程定义、流程实例状态、历史数据、任务信息等。
- Camunda/Flowable:支持主流关系型数据库,如 MySQL, PostgreSQL, Oracle, SQL Server。你可以直接使用知识库系统已有的数据库,或者为流程引擎单独配置一个数据库。
4. 与Spring Boot知识库系统集成
- Service Tasks / Delegates:在BPMN流程中,你可以定义“服务任务”(Service Task),它会调用Spring Boot应用中的Java类(实现JavaDelegate接口)。在这些Delegate中,你可以注入Spring Bean,直接调用知识库系统的Service层或Repository层,执行:
- 知识的创建、查询、更新、删除。
- 用户权限判断。
- 发送通知(邮件、短信、钉钉Webhook)。
- 调用外部API。
- User Tasks / 任务管理:对于需要人工处理的任务(如知识审批),流程引擎会创建“用户任务”(User Task)。
- 前端展示:你需要开发一个前端页面来查询并展示用户的待办任务列表,以及任务详情和处理表单。
- 后端API:Spring Boot提供API供前端查询任务(通过Camunda REST API或自定义Service),处理任务(完成、驳回等)。
- 事件监听器:流程引擎提供了丰富的事件(如流程启动、任务完成、流程结束等),你可以注册监听器,在这些事件发生时触发知识库系统的特定逻辑。
- REST API:Camunda自带一套REST API,可以直接通过HTTP请求启动流程、查询任务、完成任务等。你的Spring Boot Controller可以直接调用这些API,或者封装自己的业务API来调用Camunda服务。
5. 部署与扩展性
- 单体应用:最简单的部署方式,流程引擎和知识库系统打包在一个Spring Boot Jar中。
- 微服务:如果你的知识库系统已经是微服务架构,可以将流程引擎作为一个独立的微服务(workflow-service),通过HTTP/消息队列与知识库的其他微服务交互。这种情况下,Spring Boot集成Camunda也是非常合适的。
- Camunda 8 (Zeebe):如果你对云原生、高吞吐量、事件驱动的微服务编排有需求,可以考虑Camunda 8 (Zeebe)。它是一个独立的、可扩展的微服务,通过gRPC与客户端交互。但这会引入额外的运维复杂性。
实施步骤概要
- 确定前端技术栈:根据你的前端框架(React, Vue, Angular)和对BPMN标准遵守程度的考量,选择合适的绘图库(如
bpmn.js
或X6
+自定义)。 - 集成后端流程引擎:
- 在Spring Boot项目中添加Camunda BPM Spring Boot Starter依赖。
- 配置数据库连接。
- 创建一个简单的BPMN流程(例如,一个知识审批流程:发起 -> 审批 -> 发布/驳回)。
- 设计流程与业务逻辑映射:
- 将知识库中的具体业务操作映射为BPMN中的服务任务。
- 为人工审批等操作设计用户任务。
- 实现
JavaDelegate
和Service:- 编写
JavaDelegate
类,在其中注入知识库的业务Service,执行CRUD操作、调用通知服务等。 - 编写Controller/Service层,封装启动流程、查询待办、完成任务的API。
- 编写
- 构建前端界面:
- 流程设计器:集成前端绘图库,实现流程的绘制、保存(将BPMN XML提交给后端)。
- 流程列表/详情:展示已部署的流程定义。
- 待办任务列表:查询并展示当前用户的待办任务。
- 任务处理表单:根据任务类型动态生成表单,供用户完成任务。
- 流程实例监控:展示正在运行的流程实例及其当前状态、历史。
- 测试与部署:全面测试流程的各个环节,确保业务逻辑和流程执行的正确性。