3、技术选型:主流实时计算框架对比

做实时风控,选对计算框架,项目就成功了一半。

我见过不少团队,一上来就追新潮,选了最火的框架,结果跑起来发现根本不适合自己的场景。最后要么重写,要么硬撑着用,苦不堪言。

今天咱们就聊聊三个主流选手:FlinkSpark StreamingKafka Streams。我会结合自己的踩坑经验,帮你理清选型思路。

3.1 三大框架的核心差异

先看一张对比表,心里有个底:

维度 Flink Spark Streaming Kafka Streams
计算模型 真正的流式计算(逐条处理) 微批次(Micro-batch) 流式计算(基于Kafka分区)
延迟 毫秒级 秒级(取决于批次间隔) 毫秒级
状态管理 内置强状态管理(RocksDB) 基于Checkpoint的状态 本地状态存储(RocksDB)
精确一次语义 支持 支持 支持(需配合Kafka事务)
部署方式 独立集群 / YARN / K8s 独立集群 / YARN / K8s 嵌入应用(无需集群)
学习曲线 中等偏难 中等 较易
生态集成 丰富(Hive、HBase、ES等) 非常丰富(Spark生态) 依赖Kafka生态

说白了,这三个框架的哲学完全不同。

Flink 是「天生流式」的,每条数据来了就处理,不攒批。我习惯叫它「真·流处理」。

Spark Streaming 是「假装流式」的,它把数据切成小段,每段当批处理来跑。嗯,这里要注意:微批次带来的延迟是硬伤,但吞吐量确实高。

Kafka Streams 是「轻量流式」的,它不是一个集群,而是一个库。你写个Java应用,引入依赖,就能做流处理。

3.2 选型考量因素

选框架不是选美,得看你的实际场景。我总结了五个核心考量点:

3.2.1 延迟要求

实时风控对延迟极其敏感。一笔交易进来,你必须在几百毫秒内给出决策。

我在项目中遇到过:用Spark Streaming做反欺诈,批次间隔设到500ms,结果高峰期延迟飙到3秒。用户都付款成功了,风控结果才出来——这还有什么意义?

所以,如果你的延迟要求是秒级以内,直接选Flink或Kafka Streams。Spark Streaming更适合延迟容忍度在5秒以上的场景。

3.2.2 状态复杂度

风控场景里,状态管理是核心。比如:

  • 统计用户过去5分钟的交易次数
  • 维护IP地址的黑白名单
  • 计算滑动窗口内的累计金额

Flink的状态管理是最成熟的。它支持多种状态后端(内存、RocksDB),还能做增量Checkpoint。我做过一个项目,状态量达到几百GB,Flink跑得很稳。

Kafka Streams的状态管理也不错,但它是本地存储,如果应用挂了,状态恢复需要从Kafka重放数据——这个过程可能很慢。

Spark Streaming的状态管理相对弱一些,尤其是复杂窗口操作,写起来比较别扭。

3.2.3 运维成本

这一点很多人会忽略。你想想看,一个实时风控系统,运维复杂度直接决定了你的幸福感。

Kafka Streams 的运维成本最低。它不需要独立集群,你的应用就是处理节点。扩缩容?改个分区数,重启应用就行。

Flink 需要维护一个集群,但好在它支持多种资源管理器(YARN、K8s),部署起来还算方便。不过,调优是个技术活——并行度、Checkpoint间隔、状态后端选择,每个参数都可能影响性能。

Spark Streaming 依赖Spark集群,如果你已经有Spark做离线计算,那复用集群是个不错的选择。但要注意,流处理和批处理混跑,资源隔离要做好,否则互相影响。

3.2.4 数据源与下游

你的数据从哪里来?处理完往哪里去?

如果数据源就是Kafka,下游也是Kafka,那Kafka Streams是天然的选择。它和Kafka深度集成,连序列化、分区分配都不用你操心。

如果数据源多样(Kafka、文件、数据库CDC),或者下游需要写入HBase、Elasticsearch、MySQL等,那Flink和Spark Streaming的生态优势就体现出来了。它们有丰富的Connector,开箱即用。

3.2.5 团队技术栈

这一点很现实。你团队里都是Java开发,那Kafka Streams上手最快。如果团队熟悉Spark,那Spark Streaming更合适。

我个人建议:不要为了技术而技术。选一个团队能驾驭的框架,比选一个「最牛」的框架重要得多。

3.3 我的选型建议

场景一:高实时、低延迟、状态复杂

选 Flink。比如金融交易反欺诈、实时风控规则引擎。

场景二:中等延迟、高吞吐、已有Spark生态

选 Spark Streaming。比如日志分析、用户行为统计。

场景三:轻量级、Kafka原生、不想维护集群

选 Kafka Streams。比如简单的规则过滤、数据清洗、实时ETL。

💡 我曾经在一个项目中,用Kafka Streams做前置过滤,把明显正常的数据放行,只把可疑数据交给Flink做深度分析。这样既降低了Flink集群的压力,又保证了核心场景的低延迟。这种「分层处理」的思路,你可以参考。

3.4 一张图看懂选型逻辑

下面这张SVG图,是我梳理的选型决策流程。你可以把它贴在墙上,每次选型时对照着看:

实时计算框架选型决策树 你的实时场景是什么? 延迟要求 < 1秒? 状态复杂?需要精确一次? 已有Spark生态? Flink 高实时、强状态 Kafka Streams 轻量、Kafka原生 Spark Streaming 高吞吐、生态丰富 Kafka Streams 或 Flink(轻量场景) 核心原则 1. 延迟敏感 → Flink / Kafka Streams 2. 状态复杂 → Flink 3. 运维简单 → Kafka Streams

⚠️ 注意:选型不是一锤子买卖。我见过一个团队,一开始用Spark Streaming,后来延迟要求变高,硬生生迁移到Flink,花了三个月。所以,选型时要考虑未来1-2年的业务发展,留点余量。

3.5 我的个人经验总结

做了这么多年风控架构,我自己的「黄金组合」是这样的:

  • 核心风控引擎:用 Flink。因为它状态管理强,延迟低,适合做复杂的规则计算和模型推理。
  • 前置过滤层:用 Kafka Streams。把明显正常或明显异常的数据先处理掉,减轻Flink压力。
  • 离线分析:用 Spark。做历史数据回溯、模型训练、报表统计。

当然,这只是我的习惯。你的场景可能不同,灵活变通就好。

最后说一句:没有最好的框架,只有最合适的框架。选型之前,先想清楚你的核心诉求是什么,然后拿着这张决策树去对号入座。


公众号:蓝海资料掘金营,微信deep3321