知识卡片
异步请求/响应的关联规则:三种消息关联ID方案的取舍
内容
异步通信是非阻塞式的:发送方发出请求就无需等待,一般属于消息系统的领域;它本质上让通信本身变得透明并具备长期运行的特性,这正是[[何时引入工作流引擎的价值框架长期运行能力与可见性对ROI的贡献]]描述的能力可以派上用场的场景。为了让一个正在等待响应的流程实例在响应到达时被正确找到,工作流引擎需要某种”关联规则”,把发出去的请求和后来到达的响应对上号,书中给出三种在现实中验证过的方案:一是使用人造ID(如为每次通信专门生成的UUID),发送请求时在客户端本地生成一个全新UUID并存进流程变量,这个ID只服务于这一次通信的关联,不会受到任何干扰,是推荐做法;二是不要使用工作流引擎自身的ID(如流程实例ID)做关联键,因为运维层面重启流程实例可能产生不同的ID,厂商也可能修改ID生成规则,这类风险和”很多系统最终都从数字ID转向UUID”是同一类教训;三是谨慎使用业务数据(如订单ID)做关联键,虽然通常更简单、大多数时候也能正常运行,但存在风险——比如出于某种原因把一笔支付拆成两笔,一个订单号就会对应两笔支付,最终可能导致响应无法正确关联回对应的那一次请求。BPMN还支持把发送任务和接收任务合并进一个服务任务里,让异步通信隐藏在一个看起来很简单的服务任务背后,这通常能让流程模型更容易理解、更容易和业务利益相关者沟通,尤其是当整个系统里到处都在用异步通信时,这种封装能有效清理视觉上的混乱。
参考来源
- 位置:《流程自动化实战:系统架构和软件开发视角》第9章《工作流引擎与集成挑战》"9.1.2 异步请求/响应"(源文件:_epub-src/EPUB/xhtml/Section0001_0013.xhtml)
- 结论依据:原文逐条列出人造UUID、工作流引擎自身ID、业务数据ID三种关联规则各自的风险与推荐程度,并说明BPMN合并发送/接收任务为单个服务任务能让异步通信隐藏在简单外观之下,直接支撑本卡片结论。
- 原始内容:使用人造ID,例如专为每次通信生成的UUID……不要使用工作流引擎中的ID,比如流程实例ID……谨慎使用业务数据,例如支付时使用订单的ID……你将一个订单号会对应两笔支付,最终可能无法将响应关联起来。