
在业务流程管理中,效率往往取决于同时执行多个活动的能力。当工作流要求不同的任务同时发生时,依赖顺序逻辑会造成瓶颈。这就是“AND网关在BPMN 2.0规范中变得至关重要。正确理解如何实现并行路径,能确保你的流程模型反映实际情况,避免死锁,并优化资源利用。
本指南探讨了并行网关的机制、令牌流动逻辑以及建模复杂工作流时所需的结构规则,以避免歧义。我们将分析拆分与合并行为,比较不同类型的网关,并解决常见的同步挑战。
理解AND网关结构 🔍
AND网关是流程图中的一个决策点,用于控制令牌的流动。与仅选择一条路径的独占网关(XOR)不同,AND网关会同时将流程导向多个路径。它在视觉上表现为一个内部带有加号(+)的菱形。
此网关关联着两种主要行为:
- 并行拆分(分叉):输入流会同时触发所有输出流。
- 并行合并(汇聚):所有输入流必须全部到达后才能继续。
在建模时,必须清楚区分用于拆分流的网关和用于重新合并流的网关。尽管它们具有相同的视觉符号,但其功能角色取决于序列流的方向。
令牌流动逻辑:模型背后的引擎 ⚙️
要有效建模,必须理解流程引擎如何处理令牌。令牌代表单个流程实例在图中的进展。AND网关的行为决定了这些令牌如何复制和同步。
1. 并行拆分行为
当令牌到达配置为拆分的AND网关时:
- 单个输入令牌被消耗。
- 创建多个令牌,每个输出序列流对应一个。
- 所有输出分支同时激活。
这会创建并行执行线程。如果分支A耗时5分钟,分支B耗时2分钟,引擎会独立处理两者。令牌不会等待分支A完成才开始分支B。
2. 并行合并行为
当令牌到达配置为合并的AND网关时:
- 网关会等待,直到所有输入序列流上都有令牌输入序列流上都有令牌。
- 当最后一个令牌到达后,所有输入令牌都会被消耗。
- 在输出序列流上生成一个单一令牌。
此同步确保后续活动只有在所有并行任务完成后才开始。这对于最终审批依赖于从多个独立来源收集的数据的流程至关重要。
AND 网关与其它网关的对比 🔄
选择正确的网关类型对于流程的准确性至关重要。以下是网关行为的对比,以明确在何时应使用 AND 网关,而非 XOR 或 OR 网关。
| 网关类型 | 符号 | 分流逻辑 | 汇合逻辑 | 使用场景 |
|---|---|---|---|---|
| AND 网关 | 加号 (+) | 所有路径同时激活 | 所有路径均需完成 | 并行任务,同步 |
| XOR 网关 | 叉号 (X) | 仅一条路径激活 | 仅一条路径到达 | 条件路由,选择 |
| OR 网关 | 圆圈 (O) | 一条或多条路径 | 一条或多条路径 | 可选的并行任务 |
分步建模指南 🛠️
按照以下步骤,使用标准建模工具在流程图中实现并行路径。
步骤 1:定义触发事件
从开始事件开始。这将启动流程并生成初始令牌。确保前置逻辑(如有)清晰地进入网关,不产生歧义。
步骤 2:插入并行分流网关
将 AND 网关拖放到开始事件或前一个活动之后的画布上。将流入的流程连接到网关。
步骤 3:创建传出的顺序流
从网关绘制多个外出箭头。每个箭头代表一条独立的并行路径。清晰地标记这些流程,以表明它们启动的具体任务或子流程。
步骤 4:建模独立活动
在每条分支上放置必要的任务。这些可以是用户任务、服务任务或子流程。由于它们是并行的,各分支之间的执行顺序未定义。引擎可能会以任意顺序处理它们。
步骤 5:插入并行汇聚网关
找到所有分支汇聚的点。插入另一个 AND 网关。确保每条并行分支都有一个顺序流指向此汇聚网关。不要让任何流入流处于断开状态。
步骤 6:继续流程
从汇聚网关连接一条单一的外出顺序流到流程的下一阶段。只有当所有并行分支的令牌都到达后,该流才会激活。
处理异步执行 ⏳
在许多现实场景中,并行任务并非真正同步。一个分支可能涉及数据库更新,而另一个分支则等待外部邮件回复。这会引入延迟。
管理延迟
AND 网关的汇聚逻辑通过等待来自然处理延迟。然而,如果某条路径明显比其他路径慢,这可能导致性能问题。
- 快速路径: 快速完成并在汇聚点等待。
- 慢速路径: 耗时更长。汇聚网关会持有令牌,直到该路径完成。
为缓解此问题,应考虑业务背景。让流程等待是否可接受?如果慢速路径非关键,可改用 OR 网关,以允许流程在不等待延迟任务的情况下继续执行。
超时策略
某些建模环境允许在顺序流上附加定时器事件。如果并行分支超过特定时长,定时器事件可触发替代路径。这可防止 AND 网关无限期等待。
常见陷阱与错误处理 ⚠️
建模并行路径会引入复杂性。当设计者忽略特定要求时,会出现几种常见错误。
1. 孤立的令牌
当并行分支创建了一个令牌,但汇聚网关从未接收到它时,就会发生这种情况。这通常发生在以下情况:
- 在汇聚时意外遗漏了一条分支。
- 一条分支导向结束事件,而未返回主流程。
- 条件流完全绕过了汇聚网关。
结果: 流程实例会挂起或报错,因为引擎正在等待一个永远不会到达的令牌。
2. 死锁
当令牌在循环依赖中相互等待时,就会发生死锁。虽然在简单的 AND 网关中较少见,但在复杂循环中可能发生。
- 分支 A 等待分支 B。
- 分支B等待分支A。
结果: 该过程完全停止。仔细审查循环结构,以确保满足退出条件。
3. 竞态条件
如果两个并行分支在没有同步的情况下写入同一个共享资源(例如,数据库记录),数据完整性可能会受到损害。AND 网关同步的是流程,但不一定是资源访问.
- 使用中间事件或事务边界来管理共享数据。
- 如果发生重试,请确保服务任务具有幂等性。
稳健建模的最佳实践 ✅
为了在流程图中保持清晰和可靠性,请遵循以下指南。
- 匹配拆分与合并: 每个拆分都应有对应的合并。如果你分叉,就必须合并。
- 使用清晰的标签: 为序列流添加标签,以说明它们为何是并行的(例如,“发送邮件”、“更新CRM”)。
- 检查令牌平衡: 确保在合并处的传入流数量与拆分处的传出流数量相匹配,适用于简单流程。
- 避免嵌套网关: 保持网关逻辑简单。深度嵌套会使调试变得困难。
- 验证逻辑: 如果你的工具支持,请运行模拟。验证所有路径是否都能到达结束事件。
高级模式:嵌套的AND网关 🔗
复杂流程通常需要多级并行。你可以在子流程或主流程中嵌套AND网关。
场景:多级审批
考虑一个场景:一份文件需要两个部门同时审批,而每个部门都有两位经理。
- 一级拆分: 拆分为“部门A”和“部门B”。
- 二级拆分(在部门A内部): 分为“经理1”和“经理2”。
- 二级合并(在部门A内部): 等待两位经理。
- 一级合并: 等待两个部门返回。
这种结构确保只有在收集到所有特定审批后,流程才能继续前进。它在层次结构的每一级都保持了AND网关逻辑。
并行路径中的异常处理 ❌
如果其中一个分支失败会怎样?行为取决于流程引擎如何处理异常。
- 标准行为: 如果一个分支失败,该分支的令牌将被消耗。合并网关会等待另一个分支。根据配置,流程实例可能会进入错误状态,也可能继续执行。
- 错误子流程: 在并行分支中的任务上使用错误边界事件。这使得该分支可以本地处理错误,而不会中断整个并行流程。
- 补偿: 如果一个并行任务完成但数据无效,则可能需要补偿逻辑来撤销另一个并行分支所完成的工作。
设计者必须决定一个并行任务的失败是否应中止整个流程,还是允许另一个分支完成。这一决定通常决定了错误处理程序的放置位置。
性能影响 🚀
虽然并行路径提高了吞吐量,但也增加了资源消耗。流程引擎必须为单个实例管理多个线程或状态。
- 数据库锁定: 更多的并发令牌可能会增加数据库争用。
- 内存使用: 每个活动的令牌都需要内存来跟踪状态。
- 可扩展性: 具有许多并行分支的高吞吐量流程需要强大的基础设施。
在建模时,要考虑实例的数量。每天运行10次的并行路径流程与每天运行10,000次的流程是不同的。对于高吞吐量,应确保并行任务是轻量级的。
实施考虑要点总结 📝
使用AND网关建模并行路径是准确表示业务流程的核心能力。它使组织能够通过并发执行任务来缩短周期时间,同时通过同步保持数据一致性。
有效实施的关键要点包括:
- 使用AND网关实现强制的并行执行。
- 确保在合并点实现同步,以防止出现孤立令牌。
- 考虑并行分支之间的延迟差异。
- 实施针对并行逻辑的错误处理策略。
- 验证模型,确保所有路径正确汇聚。
通过遵循这些结构指南,您将创建一个与实际运营情况相符的稳健流程模型。AND 网关仍然是在 BPMN 标准内优化工作流效率的最强大工具之一。











