组织通常在复杂的应用程序生态系统中运行。一些是现代的云原生平台,而另一些仍然是基础性的遗留系统。这些旧系统经常保存着无法轻易丢弃的关键业务数据和逻辑。挑战在于,在无法访问其内部源代码或专有文档的情况下,理解这些系统之间的通信方式。这正是标准流程符号变得至关重要的原因。
使用业务流程模型与符号(BPMN)来记录遗留系统交互,提供了一种通用语言。它弥合了技术限制与业务需求之间的差距。本指南概述了映射这些交互的权威方法。它专注于准确性、清晰性和可维护性,而不依赖于特定供应商的工具。

🔍 标准符号的必要性
遗留系统通常被视为“黑箱”。你知道输入和输出,但内部处理逻辑却模糊不清。依赖口头传承的知识或零散的文档会导致技术债务。当流程发生变化时,未记录的依赖关系会导致失败。标准符号通过创建可视化契约来解决这一问题。
BPMN在遗留环境中的关键优势:
-
供应商独立性: 该符号是ISO标准。它不依赖于特定的实现工具。
-
清晰性: 可视化模型相比基于文本的需求减少了歧义。
-
集成规划: 它突出了数据必须在系统间移动的位置以及决策发生的位置。
-
差距分析: 建模揭示了缺失的错误处理或数据验证步骤。
通过采用标准,可以确保即使底层技术栈发生变化,文档依然有效。重点始终放在业务逻辑上,而非代码本身。
📋 准备清单
在绘制任何图形之前,必须先了解整体情况。遗留系统交互通常涉及与现代REST或SOAP API不同的独特协议。全面的清单可以防止建模阶段出现错误。
必备清单项目:
-
系统接口: 识别所有入口点。是文件投放?直接数据库查询?事务代码执行?
-
协议: 确定传输机制。是FTP、SFTP、EDI、JMS,还是直接数据库调用?
-
数据格式: 遗留系统通常使用定宽文件、COBOL副本文件或XML。需记录其模式。
-
时间: 交互是实时的、批处理的还是定时的?这决定了模型中使用的事件类型。
-
安全性: 认证方法各不相同。是证书、密码,还是网络级访问?
收集这些数据有助于选择正确的BPMN元素。例如,使用错误的元素来表示文件传输,可能会使利益相关者对延迟和可靠性产生误解。
🏗️ 遗留系统交互的核心建模元素
标准符号使用特定的形状来表示不同类型的活动。在处理遗留系统时,元素选择的精确性对于准确表示至关重要。
🏢 泳道与泳道
泳道代表不同的参与者。在遗留系统背景下,每个主要系统都应拥有自己的泳道。这可以将一个系统的边界与其他系统分离开来。
-
外部系统泳道: 表示遗留的大型机或数据库服务器。
-
流程泳道: 表示现代编排层或应用程序。
-
泳道: 在流程泳道内,使用泳道来表示不同的团队或内部模块(例如:“前端”、“集成层”、“数据库访问”)。
消息流连接泳道,顺序流则保留在泳道内部。混淆这两者是常见错误。消息流表示跨越边界,这在遗留系统交互中很典型。
🎯 事件
事件表示某件事情的发生。在遗留系统集成中,事件的类型决定了系统的行为。
-
开始事件: 由外部文件到达、手动请求或定时任务触发。
-
中间捕获事件: 等待来自遗留系统的响应。使用消息图标表示通信。
-
中间抛出事件: 向遗留系统发送请求或文件。
-
结束事件: 成功完成或错误终止。
对于遗留系统的轮询机制,应使用定时器中间事件。这明确记录了系统会在检查数据前等待一段时间,而不是接收推送通知。
🔄 网关
网关用于管理控制流。遗留系统通常具有严格的决策逻辑,必须在流程模型中予以体现。
-
独占网关(XOR): 用于简单的二元决策(例如:“记录找到”与“记录未找到”)。
-
包含网关(OR): 当多个路径可以同时执行时使用(例如:“更新账本”和“发送通知”)。
-
复杂网关: 当逻辑过于复杂,无法用标准的XOR/OR表示时使用,通常需要代码执行逻辑。
在建模遗留系统错误处理时,通常使用独占网关根据旧系统返回的错误码进行路由。
📡 处理异步通信
遗留系统很少与现代应用程序实时同步运行。它们通常依赖批处理或轮询。BPMN通过特定的事件类型来处理这种情况。
轮询模式:
如果遗留系统不支持推送通知,现代系统就必须轮询。这由定时器事件表示。
-
频率: 在事件标签中定义间隔(例如:“每5分钟”)。
-
超时: 使用边界事件来处理遗留系统在预期时间内未响应的情况。
基于文件的集成:
许多遗留系统的交换通过文件投放完成。这需要使用文件中间事件。
-
输入: 该流程等待特定文件名在目录中出现。
-
输出: 该流程将文件写入指定的投放区域。
这些模式与API调用有显著差异。准确记录它们,可确保运维团队了解延迟预期。
💾 数据表示与转换
遗留系统通常缺乏丰富的元数据。流程模型必须明确考虑数据转换。这对于在集成过程中保持数据完整性至关重要。
数据对象:
使用数据对象来表示流程中流动的信息。将其附加到活动上,以显示读取或写入的内容。
-
输入数据: 显示源格式(例如:CSV、定长格式)。
-
输出数据: 显示遗留系统所需的目标准格式。
业务规则任务:
如果数据转换涉及复杂逻辑(例如,基于遗留表计算利率),请使用业务规则任务。这可以将流程流与数据逻辑分离。
-
清晰性: 它表明决策是基于外部数据规则做出的。
-
可追溯性: 它使开发人员能够将特定逻辑与编排流程分开定位。
⚠️ 异常处理与补偿
遗留系统并不总是可靠的。它们可能会超时、拒绝数据或返回晦涩的错误代码。一个健壮的流程模型必须能够预见故障。
边界事件子流程:
将错误边界事件附加到与遗留系统交互的活动上。这可以在不立即停止整个流程的情况下捕获故障。
-
重试逻辑:创建一个子流程,以处理带有指数退避的重试。
-
死信队列:将无法恢复的错误路由到特定队列以进行人工审查。
补偿:
某些遗留事务一旦提交就无法撤销。如果下游流程失败,您可能需要撤销遗留操作。使用补偿事件来定义“撤销”逻辑。
-
触发条件: 如果主流程失败,将触发此事件。
-
操作: 在遗留系统中执行一个反向事务。
这种详细程度在标准文档中常常缺失,但对于生产环境的稳定性至关重要。
📊 常见集成模式
理解常见模式有助于标准化文档。下表概述了典型的遗留系统交互及其对应的BPMN表示。
|
模式 |
遗留系统上下文 |
BPMN元素 |
关键考虑因素 |
|---|---|---|---|
|
📂 文件投放 |
遗留主机将数据写入SFTP |
中间捕获事件(文件) |
确保处理文件锁定,以防止部分读取。 |
|
🔁 轮询 |
现代应用程序查询主机数据库 |
定时器中间事件 |
定义最大重试次数,以防止数据库锁定。 |
|
📬 消息队列 |
遗留系统向消息队列推送消息 |
中间捕获事件(消息) |
如果需要,请确保消息顺序得到保留。 |
|
🔄 事务 |
更新遗留记录 |
事务(补偿) |
如果步骤失败,请定义回滚程序。 |
|
⏳ 等待 |
等待手动批处理运行 |
定时器中间事件 |
考虑工作时间与全天候处理之间的差异。 |
🛠️ 验证与维护
模型创建后必须进行验证。一个无法执行或理解的图表毫无用处。验证包括将逻辑与实际系统行为进行比对。
验证步骤:
-
走查:与遗留团队的领域专家一起走查该图表。
-
可追溯性:确保每个池和泳道都有明确的所有者。
-
完整性:检查每个网关是否都有出口路径,且没有路径是死胡同。
-
性能:审查定时事件,确保它们与实际系统性能指标一致。
维护策略:
遗留系统即使缓慢演进,文档也必须随之更新。
-
版本控制:将流程图与代码一起存储在版本控制系统中。
-
变更管理:每当接口契约发生变化时,更新模型。
-
培训:使用该模型培训新开发人员了解遗留集成点。
🧩 符号表示中的技术细节
在将标准符号应用于旧系统时,存在一些特定的技术细节。理解这些细节可以防止误解。
外部任务:
当某个任务需要外部逻辑,而该逻辑不属于工作流引擎时,应使用外部任务。这在通过脚本或适配器调用遗留系统时很常见。它表示工作流引擎将控制权移交,并等待回调。
消息关联:
遗留系统通常返回需要与原始请求匹配的响应。在BPMN模型中使用消息关联键。这确保了即使有多个请求在进行中,正确的响应也能被路由到正确的流程实例。
事务边界:
要小心不要假设原子性。遗留系统可能不支持分布式事务。记录下数据一致性无法保证的边界。使用错误事件显式处理这些不一致。
📝 文档编写最佳实践
为确保文档有效,应严格遵守格式和内容标准。
-
一致性:在整个文档中使用相同的图标集和颜色编码。
-
注释:添加文本注释以解释无法通过图形表示的复杂逻辑。
-
图例:为任何自定义符号或特定协议图标包含图例。
-
元数据:在每个图表上包含作者、日期和版本号。
清晰的文档可降低部署过程中的错误风险。它也可作为排查生产问题的参考。
🚀 展望未来
记录遗留系统交互不仅仅是画图。它关乎理解相关系统的约束和能力。通过使用标准流程符号,你可以创建一个经得起技术变迁考验的持久资产。
注重准确性而非美观。确保每条线都代表一次真实的交互。这种严谨性为现代化工作奠定了基础。当你最终替换遗留系统时,流程模型依然有效,可指导新系统的实施。
采用这种方法可确保你的集成架构具有透明性。它使利益相关者能够看到数据流和异常处理过程,而无需深入了解底层遗留代码的技术细节。
首先盘点你的接口。绘制关键路径。定义错误场景。这种结构化方法可带来稳定且可维护的集成模式。











