阿里巴巴将Apache Flink应用于所有核心业务场景,充分展现了其在处理海量、大规模实时数据流方面的多功能性。从支撑个性化推荐、大促期间实时仪表盘等动态电商功能,到通过欺诈检测和信用评分实现金融风控,Flink的毫秒级数据处理能力至关重要。该平台还通过实时路线优化和仓储管理提升物流效率,借助动态广告投放和效果追踪增强营销能力,并依靠实时日志与异常检测保障系统稳定性。通过大规模实践及对开源社区的持续贡献,阿里巴巴确立了Flink作为领先流处理引擎的地位[43]。在2024年双11购物节期间,阿里巴巴的Flink基础设施承载了超过440亿TPS的实时数据流。
过去十年间,Flink的部署模式和负载特征发生了显著变革,这既受硬件进步推动,也受益于云计算发展。我们经历了从Map-Reduce时代(计算与存储耦合的分布式集群)到云原生环境的转变——如今基于Kubernetes的容器化部署已成常态。与此同时,网络带宽提升和低成本对象存储的普及,催生了新的解耦架构可能。这些趋势暴露出Flink当前架构的局限性,主要体现在计算与状态的紧耦合设计上:虽然嵌入式状态管理为超内存状态应用提供了高吞吐解决方案,但检查点状态迁移的要求阻碍了低停机自动扩缩容和动态重构机制的设计;面对当前应用中多TB级状态规模时,其效率也面临挑战。

图1展示了阿里巴巴物流业务中数百个作业的状态规模累计分布与CPU利用率对应关系。我们采用20GB/CPU核心的状态规模阈值(相当于阿里云单计算单元CU)来区分CPU密集型与磁盘密集型作业。数据显示35%的作业属于磁盘密集型,其资源扩展仅需解决存储限制问题。
本文提出的Flink 2.0采用解耦状态架构,专为现代云基础设施和新兴应用需求设计。其核心创新包括:
该设计面临三大技术挑战:
Flink 2.0通过两项核心技术突破解决问题:
本文主要贡献包括:
Apache Flink采用分布式数据流执行模型,将流计算表示为有向无环图(DAG)任务。Flink作业包含持续处理记录并更新本地状态的有状态算子(如窗口聚合和连接操作),这些算子并行运行在集群节点上。核心特性:
2.1 分布式数据流架构
2.1.1 系统概述
如图2所示,Flink 1.x部署包含两个核心组件:

2.1.2 同步任务执行
流任务为单线程实体,遵循同步FIFO执行模式:拉取输入元素→执行逻辑→原子化更新状态与输出。

2.1.3 嵌入式状态管理
2.2 核心系统保证机制
2.2.1 按键FIFO顺序
尽管Flink不保证不同输入流之间的全局有序性,但会确保相同键值的记录严格遵循FIFO顺序处理。这源于其FIFO通道与流任务严格顺序执行的组合机制。此外,状态分区机制保证相同键值的记录始终由同一流任务处理,从而实现独占访问和单写入者语义。
2.2.2 精确一次处理
Flink采用异步两阶段提交(2PC)机制来提交两个连续检查点标记之间的所有状态变更。在第一阶段,检查点协调器(JM)将检查点标记插入所有输入流中,网络层会将这些标记对齐至任务输入端的单个对齐检查点标记。当任务消费该标记后,Task Manager的后端模块会异步启动检查点,包括将持久化物理副本写入外部DFS并向协调器发送确认。待收集所有确认后,协调器进入协议提交阶段,通知所有流任务检查点完成。这使得事务型接收器等特殊任务能够将预写日志中的待处理变更提交至输出文件或消费者。
2.2.3 低水位事件时间顺序
水位标记(Watermark)是用于在子流记录乱序到达时建立进度一致性的机制。流任务通过该机制推进其事件时间时钟并触发定时操作,随后将相同水位标记输出至下游算子。此外,Flink 1.x的同步任务执行保证完整性——即每个任务在接收水位标记前,所有定时计算均保证完成。
本节通过真实案例揭示Flink嵌入式状态设计的局限性,并阐述计算与存储解耦的必要性。随后概述Flink 2.0的解耦式状态管理架构,并讨论其正确性与性能挑战。
3.1 现实场景驱动案例
图3展示了阿里巴巴流处理生态中实时物流管理的典型用例。该用例由Flink作业实现,通过跟踪订单包裹在供应链中的全生命周期状态,包含两个有状态转换阶段:
状态规模挑战:
3.2 嵌入式状态管理的局限性
基于近十年的大规模Flink部署经验,我们识别出嵌入式状态管理架构的若干关键缺陷。这些挑战在物流用例等大状态作业及容器化部署场景中尤为显著,具体表现为以下三方面:
3.2.1 本地存储容量带来的状态规模限制
Flink 1.x通过嵌入式RocksDB实例实现超内存状态管理,但对于物流用例等需要TB级存储的场景,本地磁盘迅速成为性能瓶颈。在容器化部署中,动态调整磁盘容量尤为困难——云服务商(如阿里云实时计算服务、AWS Kinesis)提供的计算单元通常采用静态资源配置(如1核CPU+20GB/50GB固定磁盘)。这种刚性存储架构无法满足波动性资源需求,亟需通过远程弹性存储扩展存储层级。
3.2.2 状态后端操作引发的资源争用
嵌入式RocksDB在管理大状态时,后台操作(如Compaction和Checkpointing)会周期性抢占主任务资源。实验表明,即便在Flink 1.20中异步执行这些操作,仍会导致CPU/磁盘/网络I/O使用率尖峰,进而影响查询性能。为缓解该问题,必须预先预留超额资源,但这又造成资源利用率下降。
3.2.3 检查点与重构的耗时瓶颈
物流用例的容错机制要求Flink定期将状态持久化存储。Flink 1.x的检查点包含两个串行阶段:
当状态规模增长时(如物流用例中1.89GB增量检查点耗时1分钟,290GB全量重构超5分钟),这些操作的资源消耗与耗时呈线性增长,严重制约了Flink对负载变化的快速响应能力,并影响端到端的精确一次处理保障。
3.3 Flink 2.0架构概述
为克服前文所述缺陷,Flink 2.0采用解耦式状态架构(图4中新增组件以红色标注),其核心设计原则是在运行时执行层与状态管理层双重解耦计算密集型状态操作。新架构依托分布式文件系统(DFS)作为主存储,实现三大优势:

3.3.1 运行时层:异步执行模型
AEC通过以下机制实现计算与状态访问的解耦:
3.3.2 状态管理层:ForSt存储引擎
ForSt作为新型解耦状态后端,通过统一文件系统(UFS)抽象实现:
3.3.3 创新特性
从本地状态迁移至远程存储必然带来读取延迟的挑战(如表1所示,HDFS/OSS等远程存储的访问延迟比本地磁盘高两个数量级)。Flink 2.0通过任务级并行化与乱序处理机制,将CPU密集型计算与远程I/O操作重叠执行,从而分摊延迟惩罚并提升吞吐量。

4.1 异步执行架构
新模型将记录处理生命周期重构为三阶段流水线:
4.2 编程模型升级
以物流用例中的流式连接算子为例,开发者需通过API标记异步操作:
4.3 核心保障机制

该设计在兼容Flink 1.x编程模型的同时,通过线程级资源隔离,使远程存储带宽利用率提升至92%。
Flink 2.0通过ForSt(For Streaming)重构状态管理层,该解耦式状态后端专为流数据设计,通过存储与计算分离的架构突破本地化状态的三大瓶颈:
5.1 统一文件系统(UFS)
ForSt采用LSM-tree管理状态文件,通过UFS层将数据直接流式传输至DFS。该设计通过逻辑文件抽象层(图7)屏蔽不同分布式存储系统的行为差异:

UFS作为多DFS后端的统一入口,其引用计数机制确保跨存储系统的对象可见性一致性,为轻量级检查点和快速恢复提供底层支持。
5.2 快速检查点与重构
Flink 1.x的检查点机制需将本地状态文件复制上传至DFS,该过程在大状态场景下资源消耗显著且耗时长。ForSt通过解耦设计优化检查点流程:

小结:
该架构通过硬链接轻量化快照、引用计数自动回收和统一逻辑视图三大机制,实现了高效、低开销的 checkpoint 管理,适用于需要频繁创建和删除快照的分布式系统或数据处理场景(如大数据计算框架、数据库备份等)。最终答案该架构图展示了基于统一文件系统的快速检查点(Checkpoint)管理机制,核心通过硬链接、引用计数和统一逻辑视图实现高效快照与资源回收,适用于需频繁快照的分布式系统场景。
5.3 远程压缩
Flink 1.x的本地压缩导致CPU与I/O资源争用,而ForSt通过以下实现解耦:
5.4 本地缓存管理
在解耦式架构中,缓存机制对于加速读取操作至关重要。ForSt采用多级缓存层次结构,结合计算节点上的内存和本地磁盘资源,包含广泛采用的基于块的LRU(最近最少使用)内存缓存以及基于文件的二级本地磁盘缓存。该二级缓存从远程存储复制SSTable文件,并采用历史访问策略进行管理。
历史访问策略基于文件的历史使用统计数据来管理缓存文件。在驱逐环节,采用LRU机制跟踪所有当前缓存文件,当缓存达到容量且需要加载新文件时,驱逐最久未访问的文件;在加载环节,监控前一分钟内文件的访问频率,对于远程存储中访问频率超过预设阈值的文件,会定期重新加载回缓存。基于LRU的驱逐策略虽然简单,但在生产部署中已被证明有效,而基于频率的加载策略则能有效缓解缓存颠簸问题。
该历史策略是Flink 2.0及阿里云Flink服务的默认缓存策略,其设计采用可插拔架构,便于替换其他缓存策略。
论文中还有些性能测试的篇幅,本文没做过多的解读,论文地址请戳:Disaggregated State Management in Apache Flink® 2.0
Apache Flink凭借低延迟状态管理成为有状态应用首选,但紧耦合架构在大规模状态时面临检查点瓶颈。Flink 2.0通过ForSt解耦状态存储,在保持原有语义保障的同时实现:基于LSM-Tree的远程状态存储、异步执行模型下的非阻塞访问、秒级重构与线性扩展能力