技术选型与工具链:实时计算引擎、存储与API网关

说实话,技术选型这件事,我见过太多团队一上来就追新。Flink 火就全上 Flink,Redis 快就全塞 Redis。结果呢?半年后运维想哭,业务方想骂人。今天咱们就聊聊,搭建实时数据服务目录时,到底该怎么选这些组件。

我个人习惯,选型前先问三个问题:数据量级多大?实时性要求多高?团队运维能力在哪?这三个问题没想清楚,后面全是坑。

实时计算引擎:Flink vs Spark Streaming

先说结论:如果做纯实时,我选 Flink;如果批流一体,Spark Streaming 也能打。但别急着站队,咱们拆开看。

核心差异一句话:Flink 是真正的逐条事件驱动,Spark Streaming 本质上是微批次。

Flink:真正的实时

Flink 的事件驱动架构,每条数据进来立刻处理。延迟能做到毫秒级。我在项目中遇到过这样一个场景:用户下单后需要实时更新推荐列表。用 Flink,订单事件一到,推荐模型立刻刷新。用户体验提升很明显。

Flink 的几个关键优势:

  • Exactly-Once 语义:分布式快照机制,数据不丢不重
  • 事件时间处理:乱序数据也能准确计算
  • 状态管理:内置 RocksDB,大状态也不怕

我的经验:Flink 的 Checkpoint 间隔别设太短。默认 100ms?别闹。我一般设 1-3 秒,不然状态后端扛不住。

Spark Streaming:批流一体

Spark Streaming 的微批次模式,延迟通常在秒级。但它的优势在于生态。如果你团队已经用 Spark 做离线,那 Spark Streaming 的学习成本几乎为零。

我曾经在一个项目里,白天跑实时,晚上跑离线,一套代码搞定。运维省心不少。

对比维度 Flink Spark Streaming
延迟 毫秒级 秒级
状态管理 强(RocksDB) 弱(依赖外部存储)
SQL 支持 成熟 成熟
运维复杂度 中高 中
批流一体 需额外配置 原生支持

避坑指南:我曾经见过一个团队,用 Spark Streaming 做秒级实时,结果背压处理不当,Kafka 消费 lag 越来越大。最后不得不切 Flink。所以,延迟要求 < 1 秒的场景,别犹豫,直接 Flink。

存储选型:Elasticsearch、MySQL、Redis

存储选型,说白了就是查什么、怎么查、多快查。实时数据服务目录里,这三种存储各司其职。

Elasticsearch:全文搜索与聚合

ES 的核心场景是搜索。数据目录里,用户要搜「订单金额大于 1000 的北京用户」,ES 几毫秒就能返回。我习惯用 ES 做数据索引层,把元数据、标签、业务字段都倒排进去。

但 ES 不是万能的。写入频繁的场景,ES 的 refresh 间隔会让你头疼。我一般设 5-10 秒,兼顾实时性和写入性能。

我的配置建议:分片数 = 节点数 × 2,副本数 = 1。别贪多,分片太多反而慢。

MySQL:结构化元数据

别笑,MySQL 在实时目录里依然有用。数据源的连接信息、字段映射关系、权限配置,这些结构化数据放 MySQL 最稳。我见过有人非要用 ES 存这些,结果查询复杂到想哭。

MySQL 的定位是配置中心。数据量不大,但要求强一致。读写分离、主从同步,这些基本功别省。

Redis:缓存与状态

Redis 的定位很明确:热数据缓存。实时目录里,用户频繁查询的元数据、最近 10 分钟的统计结果,放 Redis 里。TTL 设个 5 分钟,过期自动淘汰。

我曾经踩过一个坑:把全量元数据都塞 Redis。结果内存爆了,还导致缓存穿透。后来改成只缓存热点数据,冷数据走 ES,问题解决。

存储 核心场景 数据量 一致性要求 延迟
Elasticsearch 搜索、聚合 TB 级 最终一致 毫秒级
MySQL 配置、元数据 GB 级 强一致 毫秒级
Redis 缓存、状态 GB 级 最终一致 微秒级

组合拳:我常用的模式是 MySQL 存配置 → Flink 消费 Kafka 写入 ES → Redis 缓存热点查询。三层各司其职,互不干扰。

API网关:Kong vs Nginx

网关层,说白了就是统一入口。认证、限流、路由、日志,这些脏活累活交给网关。

Kong:功能全面

Kong 基于 OpenResty,插件生态丰富。认证插件(JWT、OAuth2)、限流插件、日志插件,开箱即用。我习惯用 Kong 做API 管理平台,所有实时数据服务统一注册到 Kong。

Kong 的缺点?重。部署需要 PostgreSQL 或 Cassandra 做数据存储。小团队运维起来有点吃力。

Nginx:轻量灵活

Nginx 的定位是反向代理。如果你只需要简单的路由和限流,Nginx 就够了。配合 Lua 脚本,也能实现不少功能。

我曾经在一个小项目里,直接用 Nginx + Lua 做网关。路由、限流、鉴权,几百行 Lua 搞定。运维成本极低。

对比维度 Kong Nginx
功能丰富度 高(插件生态) 低(需自研)
运维复杂度 中高 低
性能 中 高
扩展性 强(插件机制) 中(Lua 脚本)
适用场景 大型 API 管理 轻量代理

我的建议:团队 < 10 人,选 Nginx;团队 > 20 人,上 Kong。中间状态?用 Kong 的轻量模式,或者 Nginx + Kong 混合部署。

整体架构图

下面这张图,是我在项目中常用的实时数据服务目录架构。你看一眼,心里就有数了。

实时数据服务目录技术选型架构 数据源层 Kafka / Pulsar / 业务数据库 Binlog 实时计算层 Flink(主推) / Spark Streaming 存储层 Elasticsearch(搜索) | MySQL(配置) | Redis(缓存) 各司其职,组合使用 API 网关层 Kong(大型团队) / Nginx(小型团队) 前端 / 业务系统 说明:数据从 Kafka 流入 Flink 计算,结果写入 ES/MySQL/Redis,通过 API 网关统一暴露给前端

你看,整个链路很清晰。数据源进来,Flink 做实时计算,结果分三层存储,最后通过网关统一暴露。每个环节都有明确的选型依据。

总结一下我的选型原则:

  • 实时计算:延迟敏感选 Flink,批流一体选 Spark
  • 存储:搜索用 ES,配置用 MySQL,缓存用 Redis
  • 网关:大团队上 Kong,小团队用 Nginx

别盲目追新,适合自己团队的就是最好的。