1. 先别被“实时”两个字带偏,判定步骤才决定要不要 Flink
最近被问得最多的问题差不多都是同一个方向:实时场景的技术方案选型,是不是直接上 Flink 就行。每次听到这么问,我都会让提问的人先停一下,把“实时”拆成可量化的指标再谈。原因很简单,很多项目嘴上说的是实时,实际拉到会议室里一聊,五分钟更新一次也能接受;也有一些项目嘴上说五秒延迟,实际业务场景里数据晚到一分钟就会造成资损。这两种需求背后的架构选型完全不一样,硬套一套方案,后面所有环节都会别扭。
我通常会把“实时”按响应时间切成四档:毫秒级、秒级、分钟级、小时级。毫秒级实时多见于工业控制、极低延迟交易链路,这套东西和 Flink 关系不大,更多要靠消息中间件、内存计算和定制网关去拼;秒级实时才是 Flink、Spark Structured Streaming、Kafka Streams 这些计算引擎的主战场;分钟级和小时级的需求,有相当一部分用定时调度、增量批处理就能吃下来,不需要为了实时而实时。技术方案选型的第一步,是先让业务方在表格里写清楚“最晚多久必须看到结果”,而不是让他们描述“我们想要实时大屏”。大屏上那个三秒刷新,很多时候只是把三分钟前算好的结果喂给了图表,和流计算引擎没有必然关系。
把时效指标定下来之后,再看真正决定选型下限的三个东西:状态、窗口、故障恢复。如果需求只是做一个过滤转发,比如从 Kafka 读日志、解析字段、写到下游,那确实可以用很轻的方案;但如果要按用户维度做累计、做 session 切分、做双流 join,那就离不开状态存储和窗口管理。状态意味着引擎需要保存中间结果,窗口意味着引擎要处理乱序数据和时间语义,故障恢复意味着作业重启后状态不能丢、数据不能重算错。这三个特性凑到一起,才是 Flink 的看家本领,也是它和一批轻量实时框架拉开差距的地方。
Flink 的容错依赖分布式快照机制,用白话讲就是定期把每个算子的状态连同当前处理位置一起打一个全局一致性的“标记”。保存这一份标记需要额外的协调通信,也要求 source 端支持数据回放。这也是选型时不能只看延迟指标的原因:一个引擎号称毫秒级延迟,但如果状态不能可靠持久化,生产环境一重启就全乱,那这种延迟没有意义。所以我在早期评审阶段就会让团队把下面的检查单过一遍:
- 作业是否允许重复消费,还是必须精确一次语义。
- 需要维护的状态规模大概多大,单机内存能不能兜住。
- 允许的故障恢复时间是多少,能不能接受从最近 checkpoint 恢复。
- 处理的数据是否有乱序,业务上允许的乱序容忍窗口是多少。
这些问题看起来基础,但很多选型分歧恰恰是到这里才暴露的。比如有一个场景里,业务方希望做跨多个数据源的实时 join,但团队给的数据源本身不是 Kafka 这种可回放的消息队列,而是某个业务库的变更流。那这里的核心其实不是选 Flink 还是选别的引擎,而是先解决“变更数据能不能低成本、可靠地进消息链路”的问题。引擎选型一旦脱离数据接入链路去谈,后面一定会有连接器层面的返工。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 比拼引擎时不要只看 Star 数,我用业务特性做横向过滤
技术方案选型走到第二步,一般会在几类引擎之间打转:Flink、Spark Structured Streaming、Kafka Streams,偶尔还会有人提 Storm。先说 Storm,这个框架在早期实时计算里确实地位很高,但它对状态管理和增量恢复的支持太弱,一个稍复杂的窗口需求就要自己写很多外围逻辑,除非团队有极强的底层能力去维护二次开发框架,否则今天再做新项目我不会把 Storm 放进候选清单。
Spark Structured Streaming 的优势在“复用 Spark 生态”。如果团队已经在用 Spark SQL 做离线数仓,实时作业只是顺带需要分钟级延迟,那很自然会把 Structured Streaming 作为备选。它底层的微批模型天然和 Spark 批处理共用一套 SQL 层、数据源和调度体系,运维侧学习成本低。代价也是明显的:微批模型在事件时间、乱序处理和端到端延迟上的表现,比真正意义上的流处理引擎要粗糙一些。新版本 Spark 引入了持续处理模式,但成熟度、连接器覆盖和实际生产案例仍然不如它的微批主线。对延迟要求能放到十秒以上、团队 Spark 经验强的项目,我会尊重这个选型;但别指望用它做秒级以下的大状态计算。
Kafka Streams 是非常容易被小看的一个方案。它不需要独立计算集群,直接嵌在业务应用里,和 Kafka 配合时能做到天然的 partition 对齐。如果你的实时场景本质就是“Kafka 进、Kafka 出”,处理逻辑以单条转换、简单聚合为主,状态规模可控,那 Kafka Streams 的性价比会非常高,至少省掉了 Flink 集群的部署和运维成本。可是当数据源不止 Kafka,或者需要做跨多数据源 join、复杂窗口、比较多分支写入,Kafka Streams 的集成成本就会涨得很快,因为它更像个库,而不是完整平台。
这时候再看 Flink,它的定位更像“通用流处理平台”。我认可它并不是因为它什么延迟都能做,而是因为它在几个容易被实际业务卡住的地方综合得分最高:状态访问能力、事件时间处理、分布式快照、连接器生态以及 SQL 层的成熟度。很多新团队被 Flink 吸引,是从 Flink SQL 开始的;一条 create table 对应一个外部系统,一段 insert into 就能把实时链路串起来,这对生产
