知识卡片

关联流程模型与代码的三种方式:发布/订阅、引用代码与预建连接器

结构图卡

内容

延续[[流程解决方案是流程模型加胶水代码工作流引擎不存储业务实体]]“远离低代码、把模型和代码关联起来”的立场,添加胶水代码有三种常见思路。发布/订阅(pub/sub):工作流引擎自身充当消息代理,无须额外部署专门的消息代理,胶水代码去订阅引擎(常见实现是长轮询),流程运行到对应服务任务时就触发订阅方处理逻辑;这种方式让胶水代码完全由开发者掌控,带来三个明显优势——任务执行与否可控(外部服务不可用时可以直接关闭订阅,所有跑到该任务的流程实例都会安静等待,恢复订阅后自动继续处理)、胶水代码的扩缩容能和工作流引擎解耦(既可以扩容承载胶水代码的应用,也可以单独建一个worker专门处理某类任务并对其扩缩容,反过来还能限制某类资源的并发,比如OCR工具授权限制只能单任务并行时,用订阅机制天然实现”一次只处理一个”)、能在胶水代码里自主处理超时(比如视频转码这种耗时任务,胶水代码里启动转码、完成后再和引擎交互,引擎本身不会因此超时)。引用代码:直接在流程模型里引用代码,工作流引擎在自己的线程/事务上下文里执行这段代码——听起来简单,却带来技术选型受限(只能用引擎所在环境的语言)、缺乏解耦(每次引擎执行到该任务都会调用,7.1节会进一步讨论耦合话题)、必须面对计算时间/超时/事务控制等约束三重代价,最终行为不仅取决于引擎本身,还取决于引擎配置和胶水代码里的具体操作,让排障变得困难——作者早年在多个开源工作流引擎项目里最初都用引用代码(图省事),但随时间推移pub/sub在多数场景下被证明更可取,云原生架构和多语言团队进一步推动了这一偏好,现代引擎因此更专注pub/sub。预建连接器:用平台自带的连接器(如HTTP连接器)通过流程模型配置引用,常见缺点是灵活性受厂商设计局限(一旦触及连接器上限,只能等厂商扩展功能)、测试更难(连接器超出流程解决方案范围,测试灵活性也受限)、厂商专用不可移植;作者明确表示这不是首选,但组合无服务器函数或RPA机器人这类场景下连接器仍有用武之地。

结构图

flowchart TD
    A[关联流程模型与代码的三种方式] --> B[发布/订阅 pub/sub<br/>引擎充当消息代理,长轮询]
    A --> C[引用代码<br/>引擎线程内直接执行]
    A --> D[预建连接器<br/>厂商提供,流程模型内配置]
    B -->|优势| B1[任务可控开关+扩缩容解耦+超时自主处理]
    C -->|代价| C1[技术选型受限+缺乏解耦+计算时间事务约束,排障困难]
    D -->|代价| D1[灵活性受限+测试难+厂商锁定]
    B -.现代引擎的主流选择.-> E[云原生+多语言团队进一步推动]

参考来源

- 位置:《流程自动化实战:系统架构和软件开发视角》第3章《开发流程解决方案》"3.2.1 发布/订阅流程""3.2.2 在流程模型中引用代码""3.2.3 使用预建连接器"(源文件:_epub-src/EPUB/xhtml/Section0001_0006.xhtml) - 结论依据:原文详述pub/sub机制的三点优势(任务可控/扩缩容解耦/超时自主处理)、引用代码的三点代价(技术受限/缺乏解耦/事务约束)及作者亲历的行业偏好转变,以及预建连接器的三点缺点,直接支撑本卡片的结构图与解释。 - 原始内容:使用pub/sub机制,胶水代码可以完全由你控制……与pub/sub机制最大的区别在于,在这种情况下,工作流引擎在自己的上下文中执行这段代码……pub/sub在大多数情况下被证明是更可取的,所以现代引擎都专注于此……灵活性受厂商设计的局限。