知识卡片
流式处理实现流程自动化的"弹球机架构"困境
内容
流式数据处理把静态、按时间批量处理的数据转为源源不断来自队列或不可变日志的动态数据,接收即由流处理器处理,大幅降低延迟——典型例子是信用卡重复刷卡实时检测(相比夜间批处理才能发现,能在用户还在店里时就发出提醒)。流式处理和流程自动化的边界很窄:可以把多个流处理器串联起来实现一个流程(如订单履约),这继承了传统批处理的大部分缺点(延迟除外):流程由流处理器互相连接实现,流程实例并不真实存在(只有数据流经队列),你无法审视整个流程的真实运行方式,各种行为模式只在运行时才显现——尼尔·福特把这种架构称为”弹球机架构”(pinball machine architecture),精准抓住了它的特征。修改能力也有限:即便挖掘信息拿到了清晰图景,改动往往涉及多个流处理器、需要协调部署,这本身就是一种应当避免的耦合。此外常见工具只支持无环模型,无法实现回环——这对ETL作业是合理限制,却限制了在需要处理”用户修改订单”“撤销付款”这类真实业务循环场景下的适用性。即使引入图形化建模来缓解可见性问题,业务状态依然分散在各个数据流/流处理器程序中,查询一个流程实例的当前状态需要从多个数据源拼凑;出故障时无法直接停止某个特定流程实例定位处理,只能把有毒数据写入死信队列间接暴露故障。
参考来源
- 位置:《流程自动化实战:系统架构和软件开发视角》第5章《选择工作流引擎和BPMN》"5.1.3 数据流水线和流式处理"(源文件:_epub-src/EPUB/xhtml/Section0001_0008.xhtml)
- 结论依据:原文详述用流处理器串联实现流程时继承批处理大部分缺点、"弹球机架构"一词形容的可见性缺失、无环模型限制回环场景,以及故障时只能靠死信队列间接暴露问题,直接支撑本卡片结论。
- 原始内容:因为流程是由流处理器的互相连接实现的,所以缺乏整体流程的可见性……我最近听说了尼尔·福特发明的弹球机架构(pinball machine architecture)一词,我觉得他抓住了这个架构的精髓……你不得不将有毒的数据写入某个死信队列中以显示故障。