1. 实时流处理概述

大家好,欢迎来到《实时流处理企业级应用指南》的第一章。我是你们这门课的老朋友,一个在数据流水线上摸爬滚打多年的工程师。今天咱们不聊虚的,直接切入正题:到底什么是实时流处理?它跟传统的批处理有什么本质区别?

我个人习惯把流处理比作「水龙头里的水」,数据源源不断,你得一边接一边处理。而批处理呢,更像是「桶装水」,先攒够一桶,再一次性倒进锅里煮。这个比喻虽然糙,但道理不糙。

1.1 流处理与批处理的区别

先看一张对比表,把核心差异说清楚。

维度 流处理 批处理
数据范围 无界数据,持续到达 有界数据,一次性全量
延迟要求 毫秒~秒级 分钟~小时级
触发机制 事件驱动,来一条处理一条 时间驱动,定时或手动触发
计算模型 增量计算,状态持续更新 全量计算,一次性输出
典型场景 实时风控、监控告警 离线报表、数据仓库ETL
容错方式 Checkpoint + 状态恢复 任务重跑 + 幂等写入

你想想看,批处理就像做月报,月底把一个月的数据拉出来算一遍。流处理呢?就像你在双十一盯着实时交易大屏,每一笔订单进来都要立刻判断是不是盗刷。这两种模式,从设计哲学上就是两码事。

核心观点:流处理不是批处理的「加速版」,而是完全不同的计算范式。批处理面向「过去」,流处理面向「现在」和「未来」。

我在项目中遇到过不少团队,想把批处理的代码直接改改就跑流处理,结果延迟降不下来,状态还乱成一锅粥。嗯,这里要注意:流处理必须重新设计数据模型和状态管理,不能偷懒。

1.2 实时流处理的应用场景

说完了区别,咱们看看实际中哪些地方离不开流处理。我挑三个最典型的场景聊聊。

1.2.1 金融风控

金融风控是流处理的「硬核战场」。每一笔交易从发生到完成,留给风控系统的时间窗口通常只有几十毫秒。你需要在这段时间内完成:

  • 用户画像查询(历史行为、设备指纹)
  • 规则引擎匹配(如单笔金额超限、异地登录)
  • 机器学习模型打分(欺诈概率预测)
  • 决策输出(放行、拦截、人工审核)

我曾经帮一家支付公司优化过风控链路。他们原来用批处理做离线规则计算,每天凌晨跑一次。结果呢?盗刷团伙利用这个时间差,白天疯狂交易,晚上才被拦截。后来换成 Flink 流处理,延迟从 24 小时降到 50 毫秒,坏账率直接降了 60%。

避坑指南:金融风控场景对「精确一次」语义要求极高。我曾经见过因为状态后端配置不当,导致重复扣款的线上事故。记住:状态一致性 + 幂等写入是金融流处理的底线。

1.2.2 实时监控

实时监控是流处理的「家常便饭」。无论是服务器指标监控、业务大盘,还是 IoT 设备数据采集,核心诉求就三个字:快、准、稳。

举个例子,一个典型的监控流水线:

  1. 数据采集:Agent 上报 CPU、内存、QPS 等指标
  2. 流计算:滑动窗口计算 5 分钟平均负载
  3. 告警触发:超过阈值则发送钉钉/短信通知
  4. 数据持久化:写入时序数据库供后续分析

我个人习惯在监控场景里用 Kafka Streams,因为它轻量、无外部依赖,直接嵌在应用里就能跑。但如果你需要复杂的窗口聚合和状态管理,Flink 会更顺手。

1.2.3 推荐系统

推荐系统对流处理的需求,这几年越来越强烈。传统的「离线训练 + 离线推荐」模式,用户行为变化后至少要等几个小时才能看到推荐结果更新。而实时流处理能做到「用户刚点了一个商品,下一秒推荐列表就变了」。

典型的实时推荐流程:

  • 用户行为流(点击、收藏、购买)进入 Kafka
  • 流处理引擎实时更新用户兴趣向量
  • 与候选物品库做实时相似度计算
  • 返回 Top-N 推荐结果

我记得有一次做电商大促,流量峰值是平时的 20 倍。如果还用批处理,推荐结果根本来不及刷新。后来我们用 Flink 做实时特征计算,配合 Redis 做特征存储,扛住了每秒 50 万次请求的冲击。

1.3 主流流处理框架对比

市面上流处理框架不少,但真正经过大规模生产验证的,也就那么几个。我按自己的使用经验,给你做个横向对比。

特性 Flink Spark Streaming Kafka Streams Storm
计算模型 真正的流处理 微批次(Micro-batch) 流处理(基于Kafka) 流处理(Tuple模型)
延迟 毫秒级 秒级(批次间隔决定) 毫秒级 毫秒级
状态管理 内置强状态(RocksDB/Heap) 基于RDD的State 内置状态存储 无内置状态(需外部存储)
容错机制 Checkpoint + Savepoint RDD血缘 + WAL Kafka日志 + 任务重启 Ack机制 + 重放
部署方式 独立集群 / YARN / K8s Spark集群 嵌入应用(无独立集群) 独立集群
学习曲线 中等偏难 中等(熟悉Spark则简单) 简单(Java/Streams API) 中等
社区活跃度 极高(阿里主导) 高(Databricks主导) 高(Confluent主导) 低(已基本停止维护)

下面这张图,帮你理清这几个框架的定位和关系。

主流流处理框架定位图 独立集群部署 嵌入式/轻量级 Flink 真正流处理 Spark Streaming 微批次 Storm 已基本停维 Kafka Streams 嵌入应用 选型建议 • 需要毫秒级延迟 + 强状态管理 → Flink(首选) • 已有 Spark 技术栈,延迟容忍秒级 → Spark Streaming • 轻量级、不想维护集群 → Kafka Streams • 新项目不建议选 Storm,除非维护老系统

说说我的个人经验。如果你从零开始搭建实时流处理平台,我建议优先考虑 Flink。为什么?因为它在「延迟、状态管理、容错、生态」这四个维度上,目前没有明显的短板。Spark Streaming 适合那些已经重度使用 Spark 的团队,迁移成本低。Kafka Streams 则适合做「应用内的轻量流处理」,比如微服务之间的实时数据管道。

小技巧:选框架时别只看技术指标,还要看团队的技术栈和运维能力。我曾经见过一个团队强行上 Flink,结果没人会调优,线上频繁 OOM。后来换成 Kafka Streams,虽然功能弱了点,但稳定多了。记住:合适的才是最好的。

至于 Storm,嗯,它曾经是流处理的先驱,但现在已经基本停止维护了。除非你是在维护老系统,否则新项目就别考虑了。

好了,第一章的内容就到这里。流处理的世界很大,咱们后面慢慢聊。