架构风格与模式58 条

管道-过滤器架构

数据依次流经多个独立过滤器,过滤器之间通过管道传递数据;适合 ETL、编译器、图像与日志处理等可分解为独立步骤的场景。

管道-过滤器是什么

管道-过滤器架构把数据处理拆成若干个独立的过滤器,数据依次流经管道传递。每个过滤器只关心自己的输入与输出,不感知上游如何产生数据、下游如何使用结果,因此可以单独开发、测试与替换。适合 ETL、编译器、图像处理、日志清洗这类能分解为独立步骤的场景。

收益与代价

收益是每个过滤器可独立开发、测试、复用,还可以按需并行或分叉组合。代价是端到端延迟被拉长,跨过滤器的错误处理与状态管理变复杂。过滤器之间一旦共享可变状态,独立测试与并行执行的前提就消失了,这一点比性能问题更常见。

基本信息

过滤器独立处理单元:读取输入、变换、写出输出
管道连接过滤器,可缓冲数据形成背压
组合方式串行、并行或分叉
典型领域ETL、编译、图像处理、日志处理

过滤器工程要点

主题做法
幂等同一批数据重跑结果一致,重试不产生重复产物
背压管道缓冲设上限,下游变慢时阻塞或降速上游
错误策略坏数据转旁路队列,其余批次继续处理
可观测每个过滤器输出吞吐、延迟与错误计数
顺序保证需要有序时明确在哪个环节排序,不要假设全局有序

典型使用场景

  • ETL 数据清洗:抽取、校验、转换、装载各成一个过滤器
  • 日志处理:解析、脱敏、聚合、入库逐级处理
  • 编译器前端:词法、语法、语义分析逐级转换
  • 图像流水线:解码、缩放、水印、编码各自独立
  • 批处理重跑:单个过滤器可单独重跑,不必全链路重来
面向流式处理时必须先定义错误策略:跳过、重试还是整批失败。策略缺位时,单个脏数据就能阻塞整条管道,而且阻塞点通常离问题源头很远。

易错点

  • 过滤器共享可变状态,并行执行时结果不稳定,且问题难以复现
  • 管道无缓冲与背压设计,下游变慢导致上游内存持续膨胀
  • 未定义错误策略,单条脏数据阻塞整条管道,影响面远超预期
  • 过滤器粒度太细,管道衔接代码与配置比真正的处理逻辑还多

数据来源与参考

  • 《软件架构:架构模式、特征及实践指南》(Richards & Ford)
  • 《Enterprise Integration Patterns》(Hohpe & Woolf)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌