管道-过滤器是什么
管道-过滤器架构把数据处理拆成若干个独立的过滤器,数据依次流经管道传递。每个过滤器只关心自己的输入与输出,不感知上游如何产生数据、下游如何使用结果,因此可以单独开发、测试与替换。适合 ETL、编译器、图像处理、日志清洗这类能分解为独立步骤的场景。
收益与代价
收益是每个过滤器可独立开发、测试、复用,还可以按需并行或分叉组合。代价是端到端延迟被拉长,跨过滤器的错误处理与状态管理变复杂。过滤器之间一旦共享可变状态,独立测试与并行执行的前提就消失了,这一点比性能问题更常见。
基本信息
| 过滤器 | 独立处理单元:读取输入、变换、写出输出 |
|---|---|
| 管道 | 连接过滤器,可缓冲数据形成背压 |
| 组合方式 | 串行、并行或分叉 |
| 典型领域 | ETL、编译、图像处理、日志处理 |
过滤器工程要点
| 主题 | 做法 |
|---|---|
| 幂等 | 同一批数据重跑结果一致,重试不产生重复产物 |
| 背压 | 管道缓冲设上限,下游变慢时阻塞或降速上游 |
| 错误策略 | 坏数据转旁路队列,其余批次继续处理 |
| 可观测 | 每个过滤器输出吞吐、延迟与错误计数 |
| 顺序保证 | 需要有序时明确在哪个环节排序,不要假设全局有序 |
典型使用场景
- ETL 数据清洗:抽取、校验、转换、装载各成一个过滤器
- 日志处理:解析、脱敏、聚合、入库逐级处理
- 编译器前端:词法、语法、语义分析逐级转换
- 图像流水线:解码、缩放、水印、编码各自独立
- 批处理重跑:单个过滤器可单独重跑,不必全链路重来
面向流式处理时必须先定义错误策略:跳过、重试还是整批失败。策略缺位时,单个脏数据就能阻塞整条管道,而且阻塞点通常离问题源头很远。