{"name":"流处理","id":"数据技术-流处理","content":"# 流处理（Stream Processing）\n\n流处理是一种以**连续数据流**为核心的数据处理范式，强调对\"实时产生、实时传递、实时计算\"的数据进行持续响应。它不仅是一种计算模型，也是一种用于构建实时应用、实时分析系统、实时数据集成平台的**架构方法论**。\n\n本篇文档从本质模型、关键概念、设计模式、时间语义、容错模型到 Streaming SQL 与流表关系进行系统性升维整理，为理解现代流式系统（Kafka Stream / Flink / Beam / Spark Streaming）的统一认知框架提供参考。\n\n---\n\n## 流处理的本质\n\n流处理从根本上解决的是以下问题：\n\n1. **如何处理无界数据（Unbounded Data）？**\n   即永不停止增长的数据序列。\n\n2. **如何保持系统在时间上的一致性与准确性？**\n   包含事件时间、乱序处理、水位线、触发器、延迟处理等。\n\n3. **如何管理跨时间演化的状态？**\n   包含本地状态、长久状态、快照、回放、容错机制等。\n\n4. **如何让计算逻辑在分布式环境下具备可恢复性、可扩展性与精确一次性语义？**\n\n5. **如何抽象流与表之间的关系？**\n   包含 CDC、事件溯源、流表双向转换、流式 Join 等。\n\n流处理本质上是一种 **“带状态的事件驱动系统”**，在无限事件流上做有限时间窗内的滑动计算，并具备可恢复、可重复、可重放的能力。\n\n---\n\n## 流处理的应用类型\n\n流处理的典型能力可归纳为三类：\n\n#### 复杂事件处理（CEP）\n\n根据定义好的**事件模式**检测数据流中是否发生模式事件（如“连续三次失败登录”）。本质是对事件序列进行实时图灵识别。\n\n#### 流分析（窗口分析）\n\n在**时间窗口**内执行聚合计算，如 5 秒平均、10 分钟 UV、1 小时滑动累计等。\n\n#### 流式 RPC（Streaming RPC）\n\n使用流作为通信方式，实现持续响应的交互模式，如“观察模式”“增量更新模式”“实时订阅”。\n\n---\n\n## 消息系统与流处理\n\n### 演进：从消息队列到分区日志\n\n早期流处理常通过 MQ 级联方式实现：\n\n```mermaid\nstateDiagram\n  direction LR\n  数据源 --> 消息队列1\n  消息队列1 --> 处理逻辑1\n  处理逻辑1 --> 消息队列2\n  消息队列2 --> 处理逻辑3\n  消息队列2 --> 处理逻辑4\n  处理逻辑3 --> 消息队列3\n  处理逻辑4 --> 消息队列3\n```\n\n传统 MQ 存在两个限制：\n\n* 数据是**暂存的**，不会长期保留\n* 无法支撑**回放、重建下游状态、历史重算**\n\n### 分区日志消息系统：消息系统与数据库的融合\n\nKafka/Kinesis/Pulsar 等“分区日志系统”使流可以像数据库日志那样存储，并通过偏移量实现回放、重算。这是现代流平台的关键基石。\n\n![每个逻辑数据源都可以建模为它自己的日志](/assets/2022527112653.png)\n\n日志成为系统“中枢神经”：\n\n```mermaid\ngraph TB\n    subgraph 以日志为中心的基础设施栈\n        A[Log]\n        B[Graph DB, OLAP Store, Etc]\n        C[Key-Value Query Layer]\n        D[Search Query Layer]\n        E[Monitoring & Graphs]\n        F[Stream Processing]\n        G[Hadoop]\n        \n        B --> A\n        C --> A\n        A --> C\n        D --> A\n        E --> A\n        F --> A\n        A --> F\n        G --> A\n        A --> G\n    end\n```\n\n这形成了“**Log-Centric Architecture**”。\n\n---\n\n## 流处理设计模式（Patterns）\n\n### 单事件分类处理\n\n```mermaid\n---\ntitle: 单事件处理\n---\nstateDiagram-v2\n    direction LR\n    主题 --> 分支: 日志事件\n    分支 --> 高优先级主题: 错误事件\n    分支 --> 低优先级主题: 其他事件\n    高优先级主题 --> 转换成Avro\n    低优先级主题 --> 转换成Avro\n    转换成Avro --> Avro日志\n```\n\n用于事件分流、路由、格式转换。\n\n---\n\n### 本地状态聚合\n\n```mermaid\n---\ntitle: 本地状态事件处理\n---\nstateDiagram-v2\n    direction LR\n    state 处理器 {\n        本地状态 --> 聚合min,max\n        聚合min,max --> 本地状态\n    }\n    交易主题 --> 聚合min,max\n    聚合min,max --> 交易聚合主题\n```\n\n单处理器内部维护可累积的局部状态，如 min/max/count。\n\n---\n\n### 多阶段流水线处理\n\n```mermaid\n---\ntitle: 多阶段处理\n---\nstateDiagram-v2\n    state 每日获利处理器1 {\n        本地状态1 --> 每日获利或损失1\n        每日获利或损失1 --> 本地状态1\n    }\n    state 每日获利处理器2 {\n        本地状态2 --> 每日获利或损失2\n        每日获利或损失2 --> 本地状态2\n    }\n    state top10处理器 {\n        top10本地状态 --> top10\n        top10 --> top10本地状态\n    }\n    交易主题 --> 每日获利或损失1\n    交易主题 --> 每日获利或损失2\n    每日获利或损失1 --> 每日获利或损失主题\n    每日获利或损失主题 --> top10\n    top10 --> top10主题\n```\n\n多阶段计算串联是构建实时指标体系的核心架构。\n\n---\n\n### 外部数据补全（Enrichment）\n\n```mermaid\n---\ntitle: 外部数据源填充\n---\nstateDiagram-v2\n    direction LR\n    state 处理器 {\n        用户信息本地缓存 --> 连接\n        连接 --> 用户信息本地缓存\n    }\n    点击事件主题 --> 连接\n    用户信息数据库 --> 用户信息主题: cdc\n    用户信息主题 --> 连接\n    连接 --> 填充的点击事件主题\n```\n\n典型场景：用户画像、商品信息补全。\n\n---\n\n## 流处理与数据库\n\n流和数据库的关系可用统一视角描述：\n\n* 数据库日志就是一种“流”\n* 数据库表是“流重放后的快照”\n\n也就是“**流是表的增量，表是流的累积**”。\n\n### CDC：数据库 → 流\n\n```mermaid\n---\ntitle: 带有快速追随者分析数据库的变更数据获取\n---\ngraph LR\n    A[应用程序]\n    B[生产数据库]\n    C[分析快速跟随数据库]\n    D[分析]\n\n    A -- 生产事务 --> B\n    B -- CDC --> C\n    C -- 查询 --> D\n```\n\nCDC 是现代实时数据平台的核心。\n\n---\n\n## DataFlow 模型（Beam 模型）\n\nDataFlow / Beam 在抽象层面定义了流式计算的关键操作：\n\n* **ParDo**：相当于 Map\n* **GroupByKey**：相当于 Shuffle\n\n![](/assets/202358143043.webp)\n\n其强项在于统一批与流模型。\n\n---\n\n## 时间语义：事件时间、处理时间、水位线\n\n### 为什么时间很重要？\n\n流处理是“在时间上分布的数据”，而时间本身可能乱序、延迟或缺失，因此必须保证“语义正确”。\n\n#### 两种时间\n\n* **事件时间（Event Time）**：事件生成的真实时间\n* **处理时间（Processing Time）**：事件被系统处理的时间\n\n![事件时间和处理时间在实际流处理系统中的关系](/assets/2024613183835.png)\n\n事件时间更准确，处理时间更实时。\n\n---\n\n### 水位线（Watermark）\n\n水位线用于推断“事件时间已经前进到某个点，可以执行窗口计算”。\n\n```mermaid\nsequenceDiagram\n    participant Source as 数据源\n    participant System as 流处理系统\n    participant Window as 窗口计算\n    ...\n```\n\n（水位线图保持原样，此处省略描述）\n\n水位线核心作用：\n\n* 判断窗口是否完成\n* 控制乱序事件处理\n* 决定触发器是否执行\n\n完美水位线几乎不存在，现代系统均使用**启发式水位线**。\n\n---\n\n## 数据处理模式\n\n### 时间无关模式\n\n无需窗口，延迟最小。\n\n![过滤](/assets/2024613184815.png)\n![内连接](/assets/202461318494.png)\n![近似算法 流式TopK 流式 K-mean 等](/assets/2024613185012.png)\n\n---\n\n### 窗口化处理（Windowing）\n\n三大窗口：\n\n1. **固定窗口**\n2. **滑动窗口**\n3. **会话窗口**\n\n![三种窗口类型](/assets/2024613185441.png)\n\n事件时间窗口 = 正确但需要缓存\n处理时间窗口 = 实时但不稳定\n\n![基于事件时间进行窗口划分](/assets/2024613185931.png)\n\n---\n\n## 触发器（Triggers）\n\n决定**窗口何时输出结果**。\n\n类型包括：\n\n* Repeated Update（频繁、多次更新）\n* Completeness（数据齐全时触发）\n* Early / On-time / Late （基于水位线）\n\n这是现代流系统输出的核心机制。\n\n---\n\n## 精确一次性（Exactly once）\n\n包含：\n\n* 对内部状态的精确一次处理\n* 对外部系统副作用的精确一次执行（更难）\n\n方法包括：\n\n* 状态快照（Checkpoint + WAL）\n* 幂等写入\n* 去重（唯一 ID）\n\n---\n\n## 容错与状态管理\n\n### 微批处理\n\n小批作为容错单元（Spark Streaming）。\n\n### 校验点（Checkpoint）\n\n系统恢复的基本能力（Flink、Beam）。\n\n### 状态类型\n\n#### 隐式状态\n\n仅依赖执行顺序，不可持久化。\n\n#### 广义状态\n\nFlink/Beam 提供的可持久、可并行的结构化状态。\n\n---\n\n## Streaming SQL\n\n实现“用 SQL 处理流”。\n\n关键思想：\n\n* SQL 以表为中心\n* Beam 以流为中心\n* 通过物化视图实现流式视图更新\n\n两种模型最终都支持实时计算，但抽象不同。\n\n---\n\n## 流式连接（Stream Join）\n\n支持：\n\n* Inner / Left / Right / Full\n* Semi / Anti\n* 流-表连接（Enrichment）\n* 流-流连接（典型需要缓存）\n\n保留原图：\n\n```mermaid\n---\ntitle: 表连接\n---\n...\n```\n\n---\n\n## 流与表的统一模型\n\n流与表是可相互转换的：\n\n* **流 → 表**：聚合、累积\n* **表 → 流**：CDC、事件溯源\n\n可用于统一批与流：\n\n```mermaid\ngraph TD\n    A[Table] --> B[MapRead]\n    ...\n```\n\n---\n\n## 完整总结：流处理的统一认知框架\n\n1. **流是无限，表是有限。流是增量，表是快照。**\n2. **事件时间是语义正确的时间，处理时间是执行时间。**\n3. **水位线解决乱序事件，触发器解决何时输出。**\n4. **状态是流处理的灵魂，日志是系统的记忆。**\n5. **容错依赖快照 + 回放。**\n6. **流与表通过 CDC / 聚合 / 事件溯源等机制双向转换。**\n7. **DataFlow 统一了批处理与流处理。**\n8. **Streaming SQL 将流视为表的持续计算。**\n\n## 关联内容（自动生成）\n\n- [/数据技术/数据处理.md](/数据技术/数据处理.md) 该文档详细介绍了主流计算引擎（包括Flink、Spark Streaming）的特点，与流处理中提到的计算框架直接相关\n- [/数据技术/数据架构.md](/数据技术/数据架构.md) 涵盖了批处理与流处理架构的对比，与流处理文档中的架构设计模式高度相关\n- [/数据技术/数据集成.md](/数据技术/数据集成.md) 涉及流式数据处理的技术栈（Kafka+Flink），与流处理文档中的消息系统与流处理部分密切相关\n- [/数据技术/大数据.md](/数据技术/大数据.md) 介绍了流处理框架（Storm、Spark Streaming、Flink Streaming）和Kappa架构，与流处理文档内容高度重合\n- [/数据技术/数据建模.md](/数据技术/数据建模.md) 专门提到流处理场景中的数据模型设计，与文档中流表二元性概念直接相关\n- [/数据技术/数据存储.md](/数据技术/数据存储.md) 涉及Kafka等流式场景存储系统，与流处理文档中消息系统部分相关\n- [/数据技术/数据分层.md](/数据技术/数据分层.md) 提到流处理在数据计算层的应用，与流处理文档中的架构应用相关\n- [/数据技术/元数据管理.md](/数据技术/元数据管理.md) 涉及流数据处理技术栈（Kafka/Flink），与流处理文档中的技术实现相关\n- [/数据技术/任务调度系统.md](/数据技术/任务调度系统.md) 涉及Flink等流处理框架的调度机制和容错，与流处理文档中的容错模型相关\n- [/数据技术/埋点设计.md](/数据技术/埋点设计.md) 涉及Kafka和Flink等流处理技术，与流处理文档中的数据采集和传输部分相关\n- [/数据技术/数据网格.md](/数据技术/数据网格.md) 提到双时间数据处理和流处理，与流处理文档中的事件时间和处理时间概念相关\n- [/中间件/消息队列/Kafka/Kafka.md](/中间件/消息队列/Kafka/Kafka.md) 详细介绍了Kafka流处理能力，与文档中分区日志消息系统部分直接相关\n- [/中间件/消息队列/消息队列.md](/中间件/消息队列/消息队列.md) 涵盖了Exactly Once语义，与流处理文档中的精确一次性概念相关\n- [/软件工程/架构模式/响应式架构.md](/软件工程/架构模式/响应式架构.md) 涉及流处理技术作为响应式架构的核心组件，与流处理文档的应用场景相关\n- [/编程语言/编程范式/响应式编程.md](/编程语言/编程范式/响应式编程.md) 涉及事件流处理概念，与流处理文档中的事件驱动系统相关\n- [/软件工程/架构/系统设计/分布式/分布式系统.md](/软件工程/架构/系统设计/分布式/分布式系统.md) 提到流处理系统（Storm、Flink）和消息系统，与文档中的分布式流处理相关\n- [/编程语言/并发模型.md](/编程语言/并发模型.md) 涉及Kappa架构和实时流处理，与文档中的架构模式相关\n- [/软件工程/架构/数据系统.md](/软件工程/架构/数据系统.md) 涉及流处理系统的定义，与文档核心概念相关\n- [/数据技术/Hadoop.md](/数据技术/Hadoop.md) 涉及Checkpoint机制，与流处理文档中的容错机制相关\n- [/软件工程/架构/系统设计/广告平台.md](/软件工程/架构/系统设计/广告平台.md) 涉及Flink/Spark Streaming实时特征更新，与文档中的流处理应用相关\n","metadata":"tags: ['数据技术', '消息队列', '软件工程']","hasMoreCommit":false,"totalCommits":8,"commitList":[{"date":"2026-02-12T14:07:03+08:00","author":"MY","message":"doc: 整理标签","hash":"290b3e8ad18f48832ac282290238d020fc030a88"},{"date":"2025-11-20T15:18:42+08:00","author":"MY","message":"docs(data): 完善流处理技术文档内容","hash":"db05cd601a6dda79cd3c8235798e8d83b183a1d0"},{"date":"2024-11-20T16:12:20+08:00","author":"MY","message":"📦Kafka","hash":"955524f9775b97e250675e61652f914ad8337055"},{"date":"2024-06-19T14:45:14+08:00","author":"MY","message":"✏流处理","hash":"348fc1c8237121fb2ea67c4e604555251e0bef38"},{"date":"2024-06-18T19:52:22+08:00","author":"MY","message":"✏流处理","hash":"b547561e97e44ad1ee68aa36e92577fab2121c5f"},{"date":"2024-06-17T19:52:44+08:00","author":"MY","message":"✏流处理","hash":"4518a4d98711f858f0b6f4cc86e75c7400ec93a7"},{"date":"2024-06-14T16:52:41+08:00","author":"MY","message":"✏流处理","hash":"3c79dc147433884076847274225e3f8237959c24"},{"date":"2024-06-13T20:20:37+08:00","author":"MY","message":"➕流处理","hash":"786031c785bbd78729c2d621ad4b0182dc9f24b7"}],"createTime":"2024-06-13T20:20:37+08:00"}