名称: 流数据处理 描述: 使用 Kafka、Pulsar、Redpanda、Flink 和 Spark 构建事件流和实时数据管道。涵盖生产者/消费者模式、流处理、事件溯源和跨 TypeScript、Python、Go 和 Java 的 CDC。当构建实时系统、微服务通信或数据集成管道时。
流数据处理
使用现代消息代理和流处理器构建生产就绪的事件流系统和实时数据管道。
何时使用此技能
在以下情况使用此技能:
- 构建事件驱动架构和微服务通信
- 处理实时分析、监控或警报系统
- 实现数据集成管道(CDC、ETL/ELT)
- 创建日志或指标聚合系统
- 开发 IoT 平台或高频交易系统
核心概念
消息代理 vs 流处理器
消息代理(Kafka、Pulsar、Redpanda):
- 存储和分发事件流
- 提供持久性、重放能力、分区
- 处理生产者/消费者协调
流处理器(Flink、Spark、Kafka Streams):
- 转换和聚合流数据
- 提供窗口化、连接、有状态操作
- 执行复杂事件处理(CEP)
交付保证
最多一次:
- 消息可能丢失,无重复
- 开销最低
- 适用于:可接受丢失的指标、日志
至少一次:
- 消息从不丢失,可能有重复
- 中等开销,需要幂等消费者
- 适用于:大多数应用(默认选择)
精确一次:
- 消息从不丢失或重复
- 最高开销,需要事务处理
- 适用于:金融交易、关键状态更新
快速入门指南
步骤 1:选择消息代理
参见 references/broker-selection.md 获取详细比较。
快速决策:
- Apache Kafka:成熟生态系统、企业功能、事件溯源
- Redpanda:低延迟、Kafka 兼容、操作更简单(无 ZooKeeper)
- Apache Pulsar:多租户、地理复制、分层存储
- RabbitMQ:传统消息队列、RPC 模式
步骤 2:选择流处理器(如需要)
参见 references/processor-selection.md 获取详细比较。
快速决策:
- Apache Flink:毫秒级延迟、实时分析、CEP
- Apache Spark:批处理 + 流混合、ML 集成、分析
- Kafka Streams:嵌入微服务中,无需单独集群
- ksqlDB:流处理的 SQL 接口
步骤 3:实现生产者/消费者模式
选择语言特定指南:
- TypeScript/Node.js:references/typescript-patterns.md(KafkaJS)
- Python:references/python-patterns.md(confluent-kafka-python)
- Go:references/go-patterns.md(kafka-go)
- Java/Scala:references/java-patterns.md(Apache Kafka Java 客户端)
常见模式
基本生产者模式
向主题发送事件并处理错误:
1. 创建生产者并指定代理地址
2. 配置交付保证(确认、重试、幂等性)
3. 发送带键(用于分区)和值的消息
4. 处理交付回调或错误
5. 在关闭时刷新和关闭生产者
基本消费者模式
从主题处理事件并管理偏移量:
1. 创建消费者并指定代理地址和组 ID
2. 订阅主题
3. 轮询消息
4. 处理每条消息
5. 提交偏移量(自动或手动)
6. 处理错误(重试、DLQ、跳过)
7. 优雅关闭消费者
错误处理策略
对于生产系统,实现:
- 死信队列(DLQ):将失败消息发送到单独主题
- 重试逻辑:可配置重试尝试和退避
- 优雅关闭:完成处理、提交偏移量、关闭连接
- 监控:跟踪消费者滞后、错误率、吞吐量
决策框架
框架:消息代理选择
开始:需求是什么?
1. 需要 Kafka API 兼容性?
是 → Kafka 或 Redpanda
否 → 继续
2. 多租户是否关键?
是 → Apache Pulsar
否 → 继续
3. 操作简单性优先?
是 → Redpanda(单二进制,无 ZooKeeper)
否 → 继续
4. 需要成熟生态系统?
是 → Apache Kafka
否 → Redpanda(性能更好)
5. 任务队列(非事件流)?
是 → RabbitMQ 或消息队列技能
否 → Kafka/Redpanda/Pulsar
框架:流处理器选择
开始:延迟要求是什么?
1. 需要毫秒级延迟?
是 → Apache Flink
否 → 继续
2. 同一管道中批处理 + 流处理?
是 → Apache Spark Streaming
否 → 继续
3. 嵌入微服务中?
是 → Kafka Streams
否 → 继续
4. 分析师需要 SQL 接口?
是 → ksqlDB
否 → Flink 或 Spark
5. Python 为主要语言?
是 → Spark(PySpark)或 Faust
否 → Flink(Java/Scala)
框架:语言选择
TypeScript/Node.js:
- API 网关、Web 服务、实时仪表板
- KafkaJS 库(827 个代码片段,高声誉)
Python:
- 数据科学、ML 管道、分析
- confluent-kafka-python(192 个片段,得分 68.8)
Go:
- 高性能微服务、基础设施工具
- kafka-go(42 个片段,惯用 Go)
Java/Scala:
- 企业应用、Kafka Streams、Flink、Spark
- Apache Kafka Java 客户端(683 个片段,得分 76.9)
高级模式
事件溯源
将状态更改存储为不可变事件。参见 references/event-sourcing.md 获取:
- 事件存储设计模式
- 事件模式演化
- 快照策略
- 时间查询和审计跟踪
变更数据捕获(CDC)
捕获数据库更改作为事件。参见 references/cdc-patterns.md 获取:
- Debezium 集成(MySQL、PostgreSQL、MongoDB)
- 实时数据同步
- 微服务数据集成模式
精确一次处理
实现事务保证。参见 references/exactly-once.md 获取:
- 幂等生产者
- 事务消费者
- 端到端精确一次管道
错误处理
生产级错误管理。参见 references/error-handling.md 获取:
- 死信队列模式
- 带指数退避的重试策略
- 背压处理
- 下游故障的断路器
参考文件
决策指南
- references/broker-selection.md - Kafka vs Pulsar vs Redpanda 比较
- references/processor-selection.md - Flink vs Spark vs Kafka Streams
- references/delivery-guarantees.md - 至少一次、精确一次模式
语言特定实现
- references/typescript-patterns.md - KafkaJS 模式(生产者、消费者、错误处理)
- references/python-patterns.md - confluent-kafka-python 模式
- references/go-patterns.md - kafka-go 模式
- references/java-patterns.md - Apache Kafka Java 客户端模式
高级主题
- references/event-sourcing.md - 事件溯源架构
- references/cdc-patterns.md - 使用 Debezium 的变更数据捕获
- references/exactly-once.md - 事务处理
- references/error-handling.md - DLQ、重试、背压
- references/performance-tuning.md - 吞吐量优化、分区策略
验证脚本
运行这些脚本进行无令牌验证和生成:
验证 Kafka 配置
python scripts/validate-kafka-config.py --config producer.yaml
python scripts/validate-kafka-config.py --config consumer.yaml
检查:代理连接性、配置有效性、序列化格式
生成模式注册表模板
python scripts/generate-schema.py --type avro --entity User
python scripts/generate-schema.py --type protobuf --entity Event
创建:模式注册表的 Avro/Protobuf 模式定义
基准测试吞吐量
bash scripts/benchmark-throughput.sh --broker localhost:9092 --topic test
测试:生产者/消费者吞吐量、延迟百分位数
代码示例
TypeScript 示例(KafkaJS)
参见 examples/typescript/ 获取:
- basic-producer.ts - 带错误处理的简单事件生产者
- basic-consumer.ts - 带手动偏移提交的消费者
- transactional-producer.ts - 精确一次生产者模式
- consumer-with-dlq.ts - 死信队列实现
Python 示例(confluent-kafka-python)
参见 examples/python/ 获取:
- basic_producer.py - 带交付回调的生产者
- basic_consumer.py - 带错误处理的消费者
- async_producer.py - AsyncIO 生产者(aiokafka)
- schema_registry.py - 使用模式注册表的 Avro 序列化
Go 示例(kafka-go)
参见 examples/go/ 获取:
- basic_producer.go - 惯用 Go 生产者
- basic_consumer.go - 带手动提交的消费者
- high_perf_consumer.go - 并发处理模式
- batch_producer.go - 批量消息发送
Java 示例(Apache Kafka)
参见 examples/java/ 获取:
- BasicProducer.java - 带幂等性的生产者
- BasicConsumer.java - 带错误恢复的消费者
- TransactionalProducer.java - 精确一次事务
- StreamsAggregation.java - Kafka Streams 聚合
技术比较
消息代理比较
| 特性 | Kafka | Pulsar | Redpanda | RabbitMQ |
|---|---|---|---|---|
| 吞吐量 | 非常高 | 高 | 非常高 | 中等 |
| 延迟 | 中等 | 中等 | 低 | 低 |
| 事件重放 | 是 | 是 | 是 | 否 |
| 多租户 | 手动 | 原生 | 手动 | 手动 |
| 操作复杂性 | 中等 | 高 | 低 | 低 |
| 最适合 | 企业、大数据 | SaaS、IoT | 性能关键 | 任务队列 |
流处理器比较
| 特性 | Flink | Spark | Kafka Streams | ksqlDB |
|---|---|---|---|---|
| 处理模型 | 真正流式 | 微批处理 | 库 | SQL 引擎 |
| 延迟 | 毫秒级 | 秒级 | 毫秒级 | 秒级 |
| 部署 | 集群 | 集群 | 嵌入式 | 服务器 |
| 最适合 | 实时分析 | 批处理 + 流处理 | 微服务 | 分析师 |
客户端库推荐
| 语言 | 库 | 信任得分 | 片段数 | 使用场景 |
|---|---|---|---|---|
| TypeScript | KafkaJS | 高 | 827 | Web 服务、API |
| Python | confluent-kafka-python | 高(68.8) | 192 | 数据管道、ML |
| Go | kafka-go | 高 | 42 | 高性能服务 |
| Java | Kafka Java Client | 高(76.9) | 683 | 企业、Flink/Spark |
相关技能
有关身份验证和安全模式,参见 auth-security 技能。 有关基础设施部署(Kubernetes 操作符、Terraform),参见 infrastructure-as-code 技能。 有关监控指标和追踪,参见 observability 技能。 有关 API 设计模式,参见 api-design-principles 技能。 有关数据架构和数据仓库,参见 data-architecture 技能。
故障排除
消费者滞后问题
- 检查分区数量 vs 消费者数量(匹配并行度)
- 增加消费者实例或减少处理时间
- 使用 Kafka 消费者滞后指标监控
消息丢失
- 验证生产者 acks=all 配置
- 检查代理复制因子(>1)
- 确保消费者在处理后提交偏移量
重复消息
- 实现幂等消费者(跟踪消息 ID)
- 使用精确一次语义(事务)
- 设计为至少一次交付
性能瓶颈
- 增加分区数量以提高并行度
- 调整批大小和等待时间
- 启用压缩(GZIP、LZ4、Snappy)
- 参见 references/performance-tuning.md 获取详细信息