实时宽表技术选型:Flink vs Spark Streaming、消息队列选型、OLAP存储选型

做实时宽表,技术选型是第一步,也是最容易踩坑的一步。我见过不少团队,一上来就追新,结果上线后各种水土不服。说白了,选型没有银弹,只有最适合你业务场景的组合。

这一章,我把选型拆成三个层面来讲:计算引擎、消息队列、OLAP存储。每个层面我都会结合自己的实战经验,给你一些判断依据。

计算引擎:Flink vs Spark Streaming

先聊计算引擎。现在市面上主流的实时计算引擎,基本就是 Flink 和 Spark Streaming 二选一。很多人问我:「到底选哪个?」我的回答是:看你的实时性要求有多「实时」。

Flink:真正的流式计算

Flink 的设计哲学是「一切皆流」。每条数据过来,它都立即处理,延迟通常在毫秒级。我在做金融风控项目时,要求交易事件发生后 500 毫秒内完成规则匹配,Flink 是唯一的选择。

Flink 的核心优势:

  • 真正的逐条处理:数据来一条处理一条,延迟极低
  • 精确一次语义:通过 checkpoint + 两阶段提交,保证数据不丢不重
  • 事件时间语义:支持乱序事件处理,这在 IoT 场景中特别重要
  • 状态管理强大:内置 RocksDB 状态后端,可以处理 GB 级别的状态
我的经验:如果你需要秒级甚至毫秒级的延迟,或者业务逻辑依赖复杂的事件时间窗口,直接选 Flink。别犹豫。

Spark Streaming:微批处理的坚守者

Spark Streaming 本质上是微批处理,把流数据切成一个个小批次(比如每 2 秒一批),然后批量处理。延迟通常在秒级到十秒级。

Spark Streaming 的适用场景:

  • 延迟容忍度较高:比如分钟级的报表聚合
  • 与 Spark 生态深度绑定:如果团队已经重度使用 Spark 做离线处理,复用 Spark Streaming 可以降低运维成本
  • 批流一体需求:Spark 3.0 之后的 Structured Streaming 在批流统一上做得不错
避坑指南:我曾经在一个项目里用 Spark Streaming 做秒级聚合,结果发现因为微批的调度开销,实际延迟远高于预期。后来换成 Flink,延迟从 5 秒降到了 200 毫秒。如果你的业务对延迟敏感,慎用 Spark Streaming。

对比总结

维度 Flink Spark Streaming
处理模式 逐条流式 微批处理
延迟 毫秒级 秒级
精确一次 原生支持 需配置
状态管理 强(RocksDB) 弱(依赖外部存储)
学习曲线 较陡 较平缓
生态整合 独立生态 与 Spark 生态紧密

消息队列选型:Kafka vs Pulsar

消息队列是实时宽表的「血管」,数据从源头到计算引擎,全靠它来承载。选错了,后面全是坑。

Kafka:成熟稳定的老大哥

Kafka 是目前最成熟的消息队列,社区活跃,生态完善。我做过的大多数实时项目,消息层都用的 Kafka。

Kafka 的优势:

  • 吞吐量极高:单机可以支撑百万条/秒的消息写入
  • 持久化可靠:基于磁盘的顺序读写,数据不丢
  • 生态丰富:与 Flink、Spark、ClickHouse 等都有成熟的连接器
  • 运维经验多:网上踩坑案例多,遇到问题容易找到解决方案
我的建议:如果你的团队对消息队列的运维经验有限,或者业务场景比较常规(比如日志采集、CDC 数据同步),选 Kafka 是最稳妥的选择。

Pulsar:云原生新贵

Pulsar 是后起之秀,设计上更云原生。它把存储和计算分离,支持存算分离架构。

Pulsar 的亮点:

  • 存算分离:Broker 无状态,存储层使用 BookKeeper,扩缩容更灵活
  • 多租户原生支持:内置租户、命名空间、权限管理
  • 延迟更低:相比 Kafka,Pulsar 的端到端延迟更低
  • 队列模型更丰富:支持独占、共享、灾备等多种订阅模式
我曾经踩过的坑:在一个多租户的 SaaS 项目中,我们选了 Pulsar。结果因为 BookKeeper 的配置调优没做好,导致写入延迟抖动。后来花了整整一周才把参数调稳。Pulsar 虽然架构先进,但运维复杂度比 Kafka 高不少。

选型建议

场景 推荐 原因
常规实时数仓 Kafka 成熟稳定,生态完善
多租户 SaaS Pulsar 原生多租户支持
云原生环境 Pulsar 存算分离,弹性更好
团队经验有限 Kafka 踩坑案例多,容易排查

OLAP存储选型:ClickHouse vs Doris vs StarRocks

OLAP 存储是实时宽表的最后一环,数据最终要在这里被查询和分析。选型不对,查询慢、并发低、运维难,前面做的所有努力都白费。

ClickHouse:列式存储的标杆

ClickHouse 是单表查询的王者。它的列式存储和向量化执行引擎,让它在聚合查询上快得离谱。

ClickHouse 的优势:

  • 单表查询极快:十亿级数据秒级响应
  • 压缩比高:列式存储 + 多种压缩算法,存储成本低
  • SQL 支持好:兼容大部分标准 SQL
  • 运维相对简单:单机部署就能跑
我的经验:在广告实时报表项目中,我们用 ClickHouse 存储每天的百亿级曝光数据。单表聚合查询基本都在 1 秒内返回。但要注意,ClickHouse 的 Join 性能很差,多表关联场景要慎用。

Doris:MPP 架构的均衡之选

Doris 是百度开源的 MPP 数据库,在查询性能和并发能力之间取得了不错的平衡。

Doris 的特点:

  • 查询性能均衡:单表和多表 Join 都有不错的表现
  • 高并发支持:通过分区分桶 + 物化视图,可以支撑数千 QPS
  • 实时导入:支持 Stream Load,秒级可见
  • 运维友好:Web UI 管理,扩缩容方便
我的建议:如果你的业务场景既有单表聚合,又有复杂的多表关联,Doris 是一个比较稳妥的选择。我在电商实时大屏项目中用过 Doris,日均 10 万+ 查询,P99 延迟控制在 200 毫秒以内。

StarRocks:Doris 的进化版

StarRocks 是从 Doris 分叉出来的,在查询优化器和向量化执行上做了大量改进。

StarRocks 的亮点:

  • 查询性能更强:CBO 优化器 + 向量化执行,复杂查询比 Doris 快 2-3 倍
  • 物化视图更智能:支持自动刷新和透明改写
  • 主键模型:支持 Upsert 和 Delete,适合实时更新场景
  • 生态兼容:兼容 MySQL 协议,迁移成本低
避坑指南:StarRocks 虽然性能强,但社区版本的功能更新节奏较快,版本兼容性有时会出问题。我建议在生产环境中使用 LTS 版本,不要追新。

选型对比

维度 ClickHouse Doris StarRocks
单表查询 ★★★★★ ★★★★ ★★★★★
多表 Join ★★ ★★★★ ★★★★★
高并发 ★★★ ★★★★ ★★★★
实时导入 ★★★★ ★★★★★ ★★★★★
运维复杂度 ★★ ★★★ ★★★
社区活跃度 ★★★★★ ★★★★ ★★★★

整体技术栈选型框架

下面这张图,是我个人总结的实时宽表技术栈选型框架。你可以根据业务场景,沿着这个路径做决策。

实时宽表技术栈选型框架 数据源层(MySQL/CDC/日志) 消息队列层(Kafka / Pulsar) 计算引擎层(Flink / Spark Streaming) OLAP存储层(ClickHouse / Doris / StarRocks) 应用层(实时大屏 / 报表 / API) 选型核心原则 延迟要求 → 计算引擎 吞吐量 → 消息队列 查询模式 → OLAP存储 常见组合推荐 低延迟:Flink+Kafka+StarRocks 高吞吐:Spark+Kafka+ClickHouse 均衡型:Flink+Kafka+Doris

嗯,这张图基本概括了实时宽表的完整链路。从数据源到消息队列,再到计算引擎,最后落地到 OLAP 存储。每一层的选型都直接影响整个链路的性能和稳定性。

我的最终建议:选型不是一步到位的。我建议你先做一个小规模的 POC(概念验证),用真实数据和真实查询场景来验证选型是否合理。别光看 Benchmark,那都是别人家的数据。