Skip to content

工作流面试高频问题汇总

面试官问你工作流引擎,可能不只是想考察你会不会用。

他们更想知道的是:你有没有理解工作流的本质?你在项目中遇到的那些「坑」,有没有自己总结过?

这篇文章汇总了工作流相关的面试高频问题,帮你理清思路。


一、基础概念类

问题1:BPMN 2.0 是什么?它解决了什么问题?

参考回答:

BPMN(Business Process Model and Notation)是一套标准化的业务流程建模符号,用于描述业务流程。

解决的问题:

  1. 统一语言:业务人员和开发人员用同一套符号,减少沟通成本
  2. 可视化:流程图比代码更直观
  3. 标准化:不同厂商的流程引擎可以互操作
  4. 可执行:BPMN 描述的流程可以直接在引擎中执行

核心元素:

  • 事件:开始、中间、结束
  • 活动:任务、子流程
  • 网关:排他、并行、包含、事件
  • 流:顺序流、消息流

问题2:Flowable 和 Camunda 有什么区别?

参考回答:

两者都是开源工作流引擎,核心功能相似,但有一些差异:

维度FlowableCamunda
起源从 Activiti fork (2016)从 Activiti fork (2013)
外部任务需要自行实现原生支持,更完善
Web 管理基础Cockpit 功能更强大
CMMN开源支持企业版
商业支持社区版有企业版

选型建议:

  • 需要外部系统集成 → Camunda
  • 预算有限、需要 CMMN → Flowable
  • 复杂审批流 → 两者皆可

问题3:什么是流程定义、流程实例、任务?

参考回答:

这是工作流的三个核心概念:

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   流程定义(Process Definition)                                  │
│   • 业务流程的静态描述,类似「模板」                             │
│   • 定义了流程有哪些节点、节点顺序、参与者                       │
│                                                                 │
│   流程实例(Process Instance)                                   │
│   • 流程定义的一次执行,类似「模板填写的表格」                   │
│   • 每个流程实例有唯一的 ID                                     │
│   • 包含运行时的变量、状态                                       │
│                                                                 │
│   任务(Task)                                                  │
│   • 流程实例中需要人工处理的节点                               │
│   • 有处理人(assignee)、候选人(candidate)                   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

类比

  • 流程定义 = 类(Class)
  • 流程实例 = 对象(Object)
  • 任务 = 方法调用(Method Invocation)

二、核心机制类

问题4:并行网关(Parallel Gateway)和排他网关(Exclusive Gateway)的区别?

参考回答:

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   排他网关(Exclusive Gateway)                                  │
│   ┌─────────────────┐                                           │
│   │  条件判断       │                                           │
│   └──┬──┬──┬──┬──┘                                           │
│       │  │  │  │                                               │
│       ↓  ↓  │  │                                               │
│      [A] [B] │  │  只选择一条满足条件的分支                     │
│             ↓  │                                               │
│            [C] │                                               │
│               ↓                                               │
│   执行: A 或 B 或 C 中的一个                                     │
│                                                                 │
│   并行网关(Parallel Gateway)                                   │
│   ┌─────────────────┐                                           │
│   │  并行分支        │                                           │
│   └──┬──┬──┬──┬──┘                                           │
│       │  │  │  │                                               │
│       ↓  ↓  ↓  ↓                                               │
│      [A] [B] [C] [D] 所有分支同时执行                           │
│       │  │  │  │                                               │
│       └──┴──┴──┴──┘                                           │
│           ↓                                                    │
│        等待所有分支完成                                          │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

使用场景:

  • 排他网关:需要根据条件选择一条路径(金额判断)
  • 并行网关:多个任务可以同时执行(多人审批)

问题5:什么是会签?如何实现串行会签和并行会签?

参考回答:

会签(Multi-Instance)是一个任务被重复执行多次的模式。

并行会签:多个人同时审批,所有人都通过才算成功

┌────────┐  ┌────────┐  ┌────────┐
│ 用户A  │  │ 用户B  │  │ 用户C  │   同时执行
└───┬────┘  └───┬────┘  └───┬────┘
    │           │           │
    └───────────┴───────────┘

           所有人都通过

串行会签:按顺序审批,上一个人通过才到下一个人

用户A → 用户B → 用户C   依次执行

BPMN 配置:

xml
<!-- 并行会签 -->
<userTask id="multiApproval">
    <multiInstanceLoopCharacteristics isSequential="false">
        <loopCardinality>3</loopCardinality>
    </multiInstanceLoopCharacteristics>
</userTask>

<!-- 串行会签 -->
<userTask id="sequentialApproval">
    <multiInstanceLoopCharacteristics isSequential="true">
        <loopCardinality>3</loopCardinality>
    </multiInstanceLoopCharacteristics>
</userTask>

问题6:子流程(Sub Process)和调用活动(Call Activity)的区别?

参考回答:

类型子流程调用活动
定义位置内嵌在父流程 XML独立部署的流程
生命周期随父流程可独立运行
变量共享通过入参/出参传递

子流程适用场景:逻辑封装,不需要独立追踪

调用活动适用场景

  • 多个流程复用同一个子流程
  • 子流程需要独立管理(单独的历史、监控)
  • 需要解耦主流程和子流程的变更

问题7:流程变量(Process Variable)的作用域是什么?

参考回答:

Flowable 中变量有三个作用域:

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   全局变量(Process Instance 级别)                              │
│   • 整个流程实例共享                                           │
│   • runtimeService.setVariable()                                │
│                                                                 │
│   本地变量(Execution 级别)                                    │
│   • 只在当前执行分支有效                                       │
│   • 并行分支之间互不影响                                       │
│   • runtimeService.setVariableLocal()                          │
│                                                                 │
│   任务变量(Task 级别)                                        │
│   • 只在任务存在期间有效                                       │
│   • 任务完成后可选择保留或删除                                 │
│   • taskService.setVariableLocal()                              │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

为什么需要区分? 并行分支各自需要临时变量时,用本地变量避免冲突。


三、实战应用类

问题8:如何设计一个通用的审批流程?

参考回答:

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   通用审批流程设计                                               │
│                                                                 │
│   ┌────────┐                                                    │
│   │ 开始   │                                                    │
│   └───┬────┘                                                    │
│       ↓                                                         │
│   ┌─────────────────────┐                                      │
│   │  选择审批模板        │  ← 不同业务用不同模板                 │
│   └──────────┬──────────┘                                      │
│              ↓                                                  │
│   ┌─────────────────────┐                                      │
│   │  动态生成审批节点   │  ← 根据业务规则生成节点               │
│   │  (调用活动)        │                                      │
│   └──────────┬──────────┘                                      │
│              ↓                                                  │
│   ┌─────────────────────┐                                      │
│   │  会签审批           │  ← 可配置串行/并行                    │
│   │  (Multi-Instance)  │                                      │
│   └──────────┬──────────┘                                      │
│              ↓                                                  │
│   ┌─────────────────────┐                                      │
│   │  结果处理           │  ← 通过/驳回/转交                     │
│   └──────────┬──────────┘                                      │
│              ↓                                                  │
│   ┌────────┐                                                    │
│   │ 结束   │                                                    │
│   └────────┘                                                    │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

核心设计原则:

  1. 审批规则与流程分离(用配置而非硬编码)
  2. 使用调用活动支持多种审批模板
  3. 使用会签支持多人审批
  4. 审批节点动态生成(根据业务类型)

问题9:如何处理流程驳回和撤回?

参考回答:

流程驳回和撤回是常见的业务需求:

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   驳回:当前审批人拒绝,流程回到之前某个节点                      │
│                                                                 │
│   方案1:使用消息触发                                           │
│   runtimeService.messageEventReceived("reject", executionId, variables);
│                                                                 │
│   方案2:使用信号触发                                           │
│   runtimeService.signal(executionId, variables);
│                                                                 │
│   方案3:直接操作执行上下文                                     │
│   • 创建新的执行线到目标节点                                    │
│   • 删除当前执行线                                             │
│   • 需要谨慎处理状态一致性                                      │
│                                                                 │
│   撤回:申请人想撤回已提交的申请                                 │
│                                                                 │
│   条件:                                                        │
│   • 当前没有正在审批的任务(所有人还没处理)                     │
│   • 或者实现了「撤回」功能的特殊逻辑                             │
│                                                                 │
│   实现:                                                        │
│   • 删除当前流程实例                                            │
│   • 创建新的流程实例(复用或新建)                              │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

注意:BPMN 标准不直接支持「回到上一个节点」,需要通过网关 + 变量控制实现。


问题10:如何实现流程超时处理?

参考回答:

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   超时处理方案                                                   │
│                                                                 │
│   ┌──────────────┐                                              │
│   │   审批任务   │ ←──┐                                         │
│   └──────┬───────┘   │ 定时器边界事件                           │
│          │           │ (2小时后触发)                             │
│          ↓           │                                          │
│   ┌──────────────┐   │                                          │
│   │  超时处理    │ ←──┘                                         │
│   │  • 转派      │                                              │
│   │  • 催办      │                                              │
│   │  • 自动通过  │                                              │
│   └──────────────┘                                              │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
xml
<!-- BPMN 配置 -->
<userTask id="approvalTask">
    <boundaryEvent id="timeout" attachedToRef="approvalTask">
        <timerEventDefinition>
            <timeDuration>PT2H</timeDuration>  <!-- 2小时 -->
        </timerEventDefinition>
    </boundaryEvent>
    <sequenceFlow sourceRef="timeout" targetRef="handleTimeout"/>
</userTask>

注意事项:

  1. 定时器基于数据库轮询,需要开启作业执行器
  2. 服务器时间变化可能影响定时器准确性
  3. 考虑多实例部署下的重复触发问题

四、架构设计类

问题11:工作流引擎如何保证高可用?

参考回答:

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   高可用部署架构                                                 │
│                                                                 │
│   ┌─────────┐  ┌─────────┐  ┌─────────┐                       │
│   │ Node 1  │  │ Node 2  │  │ Node 3  │                       │
│   │ Engine  │  │ Engine  │  │ Engine  │                       │
│   └────┬────┘  └────┬────┘  └────┬────┘                       │
│        │             │             │                           │
│        └─────────────┼─────────────┘                           │
│                      ↓                                          │
│              ┌──────────────┐                                  │
│              │   Database   │                                  │
│              │  (共享存储)  │                                  │
│              └──────────────┘                                  │
│                                                                 │
│   关键机制:                                                    │
│   1. 数据库锁:同一作业只有一个节点执行                          │
│   2. 定时器锁:防止重复触发                                     │
│   3. 状态同步:所有节点共享数据库                               │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

关键配置:

java
// 启用集群模式
processEngineConfig
    .setJobExecutorActivate(true)
    .setAsyncExecutorEnabled(true)
    .setJobExecutorLockTime(TimeDuration.ofMinutes(5));

问题12:工作流与业务系统如何集成?

参考回答:

集成方式有三种:

方式1:嵌入式

┌─────────────────────────┐
│    业务系统              │
│  ┌─────────────────┐   │
│  │  工作流引擎      │   │ 同一 JVM
│  └─────────────────┘   │
└─────────────────────────┘
  • 优点:性能高,调用方便
  • 缺点:紧耦合

方式2:REST API

┌─────────────┐      ┌─────────────────┐
│  业务系统   │ ←──→ │  工作流服务     │
│             │ REST │                │
└─────────────┘      └─────────────────┘
  • 优点:解耦,跨语言
  • 缺点:网络延迟,需要处理超时

方式3:消息队列

┌─────────────┐      ┌─────────┐      ┌─────────────────┐
│  业务系统   │ ───→ │  MQ    │ ───→ │  工作流服务     │
└─────────────┘      └─────────┘      └─────────────────┘
  • 优点:解耦,削峰填谷
  • 缺点:复杂度高,需要处理消息幂等

问题13:流程引擎的数据库表设计有哪些?

参考回答:

Flowable/Camunda 的表分为几类:

前缀说明生命周期
ACT_RE_*Repository,流程定义永久
ACT_RU_*Runtime,运行时数据临时
ACT_HI_*History,历史数据永久
ACT_GE_*General,通用数据永久
ACT_ID_*Identity,身份管理永久

关键表:

  • ACT_RE_DEPLOYMENT:部署记录
  • ACT_RE_PROCDEF:流程定义
  • ACT_RU_EXECUTION:执行实例
  • ACT_RU_TASK:当前任务
  • ACT_RU_VARIABLE:运行时变量
  • ACT_HI_PROCINST:流程实例历史
  • ACT_HI_TASKINST:任务历史

五、场景分析类

问题14:如何设计一个能动态修改流程的审批系统?

参考回答:

静态 vs 动态:

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   静态流程:流程定义写死,节点和顺序固定                         │
│   • 优点:简单、稳定                                            │
│   • 缺点:不灵活,需求变化需要改代码                            │
│                                                                 │
│   动态流程:流程可配置,节点和顺序可动态调整                   │
│   • 优点:灵活                                                │
│   • 缺点:复杂度高                                              │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

实现方案:

  1. 规则引擎驱动:使用 DMN 决策表决定审批路径
  2. 动态表单:审批节点根据业务数据动态生成
  3. 配置化设计:节点、连线、参与者都存数据库
  4. 调用活动:不同业务调用不同子流程

推荐方案

  • 节点可配置 → 调用活动 + 子流程
  • 顺序可配置 → 数据库存储流程图配置
  • 参与者可配置 → 规则引擎 + 表达式

问题15:流程引擎挂了怎么办?

参考回答:

问题分析:

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   流程引擎可能出现的故障:                                       │
│                                                                 │
│   1. 引擎进程崩溃                                                │
│   2. 数据库连接断开                                              │
│   3. 网络分区(集群)                                           │
│                                                                 │
│   对流程的影响:                                                 │
│   • 正在执行的任务可能丢失                                      │
│   • 定时器可能重复触发                                          │
│   • 事务可能不一致                                              │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

保障措施:

  1. 事务一致性

    • Flowable/Camunda 使用数据库事务
    • 保证操作原子性
  2. 幂等设计

    • 外部调用要支持幂等
    • 使用分布式锁
  3. 作业恢复

    • 引擎重启后会扫描未完成的作业
    • 根据配置重试或标记失败
  4. 监控告警

    • 监控作业失败率
    • 监控流程卡住情况

六、开放性问题

问题16:你觉得工作流引擎的优缺点是什么?

参考回答:

优点:

  1. 业务流程可视化,易于理解
  2. 标准化程度高(BPMN)
  3. 社区活跃,文档完善
  4. 开源版本可用

缺点:

  1. 学习成本(需要理解 BPMN)
  2. 额外的运维成本(数据库表、作业执行器)
  3. 性能开销(相比直接代码)
  4. 灵活性受限(复杂逻辑还是要写代码)

什么时候用:

  • 业务流程复杂,需要可视化
  • 审批流程多,需要统一管理
  • 需要审计和追踪

什么时候不用:

  • 简单状态机,直接写代码更简单
  • 超高并发,流程引擎可能成为瓶颈
  • 流程非常简单,不需要引擎

问题17:如果让你设计一个工作流引擎,你会怎么做?

参考回答:

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   核心设计思路                                                   │
│                                                                 │
│   1. 状态机驱动                                                  │
│      • 每个节点是一个状态                                        │
│      • 流转是状态转换                                           │
│      • 使用表存储当前状态                                        │
│                                                                 │
│   2. 事件驱动                                                   │
│      • 状态转换触发事件                                          │
│      • 事件触发监听器                                           │
│      • 解耦业务逻辑                                              │
│                                                                 │
│   3. 插件化设计                                                  │
│      • 网关可扩展                                                │
│      • 监听器可插拔                                              │
│      • 存储可切换                                                │
│                                                                 │
│   4. 关键组件:                                                 │
│      • 流程定义解析器(解析 BPMN/XML)                          │
│      • 流程执行器(状态机驱动)                                  │
│      • 任务管理器(分配、签收、完成任务)                        │
│      • 作业调度器(定时器、异步任务)                           │
│      • 历史记录器(审计追踪)                                    │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

总结

工作流面试的核心知识点:

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   必会知识点:                                                   │
│   1. BPMN 基础元素(事件、任务、网关)                         │
│   2. 流程变量作用域                                             │
│   3. 会签(串行/并行)                                          │
│   4. 子流程与调用活动                                           │
│   5. 候选用户、任务分配                                         │
│                                                                 │
│   加分知识点:                                                   │
│   6. 高可用部署                                                 │
│   7. 性能优化                                                   │
│   8. 动态流程设计                                               │
│   9. 与业务系统集成方案                                         │
│                                                                 │
│   进阶知识点:                                                   │
│   10. 事务一致性保证                                            │
│   11. 外部任务机制                                              │
│   12. 工作流引擎架构设计                                        │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

留给你的问题

学完这些问题,来思考几个延伸问题:

  1. 如果让你在一个每天 100 万流程实例的系统中选择工作流引擎,你会选哪个?需要考虑哪些因素?

  2. 工作流引擎和消息队列都能实现异步处理,它们各自的优势是什么?什么场景下应该用工作流,什么场景下应该用消息队列?

  3. 如果你发现团队在使用工作流引擎时,90% 的场景只是简单的状态流转(新建 → 审批 → 完成),而不是复杂的 BPMN 流程——你会不会建议简化架构,直接用数据库状态机?

这三个问题涉及到技术选型架构权衡工程实践,值得你在工作中不断思考。

基于 VitePress 构建