Flink 集群内部节点之间的通信是用 Akka 实现,比如 JobManager 和 TaskManager 之间的通信。而 operator 之间的数据传输是用 Netty 实现。
RPC 框架是 Flink 任务运行的基础,Flink 整个 RPC 框架基于 Akka 实现。
一、相关概念
RPC(Remote Procedure Call)
概念
-
定义:远程过程调用协议,允许程序像调用本地方法一样调用远程服务,隐藏底层网络通信细节。
-
作用:在分布式系统中,实现跨节点的控制指令传递(如任务调度、状态同步等)。
-
Flink 中的应用:
-
JobManager 与 TaskManager 之间的通信(任务部署、心跳检测、故障通知等)。
-
Checkpoint 协调、资源申请等分布式操作。
-
核心特点
-
同步/异步调用:支持阻塞式调用或异步回调。
-
序列化:参数和返回值需要序列化传输(如 Flink 使用
TypeSerializer
)。 -
容错:通过重试机制或超时处理保证可靠性。
Akka
概念
-
定义:基于 Actor 模型的并发框架,提供高性能、分布式的消息驱动编程模型。
-
Actor 模型:每个 Actor 是独立执行单元,通过异步消息传递通信,天然支持分布式和容错。
-
Flink 中的应用:
-
早期版本(≤1.14):Flink 的 RPC 层基于 Akka 实现,JobManager 和 TaskManager 的通信通过 Akka Actor 完成。
-
核心场景:任务调度、资源管理、Checkpoint 协调等控制层面的通信。
-
核心特点
-
异步非阻塞:天然支持高并发和低延迟。
-
容错机制:通过监督策略(Supervision)处理 Actor 故障。
-
分布式扩展:Actor 可跨节点部署,形成分布式系统。
Netty
概念
-
定义:基于 NIO 的高性能网络通信框架,专注于 TCP/UDP 数据传输。
-
作用:提供可扩展的网络层实现,支持高吞吐量和低延迟的数据传输。
-
Flink 中的应用:
-
数据传输层:TaskManager 之间的数据交换(如 Shuffle、广播数据)。
-
替代 Akka:从 Flink 1.15 开始,Netty 成为默认的 RPC 实现,逐步取代 Akka。
-
核心特点
-
零拷贝:通过
ByteBuf
减少内存复制开销。 -
事件驱动:基于 Channel 和 EventLoop 的高效 IO 处理。
-
可插拔协议:支持 HTTP、WebSocket 等多种协议。
三者的关系
协作模式
-
RPC 是通信协议:
-
定义了分布式节点间的交互方式(如方法调用、参数传递)。
-
Akka 或 Netty 是实现 RPC 的底层框架:
-
在早期版本,Flink 使用 Akka Actor 实现 RPC。
-
新版本中,Flink 基于 Netty 实现 RPC(更轻量、无依赖)。
-
-
-
Akka vs. Netty 的角色演变:
-
Akka:早期负责控制流(任务调度、心跳)和 RPC。
-
Netty:始终负责数据流(Shuffle 数据传输);新版本接管 RPC 层。
-
-
分工与协同:
-
控制流(RPC):协调作业生命周期(如启动、停止)、资源管理。
-
数据流(Netty):处理实际数据交换(如算子间的 Record 传输)。
-
架构演进
-
Flink 1.15+:为了减少对 Akka 的依赖(避免版本冲突),Flink 逐步将 RPC 层迁移到基于 Netty 的自研实现(
flink-rpc
模块)。 -
当前状态:
-
控制流:Netty-based RPC。
-
数据流:Netty 网络栈(替代了早期的 Netty + Akka 混合模式)
-
二、Akka 与 Actor 模型
Akka 是 Actor Model 的一个实现,在 Actor 模型中,所有的实体被认为是独立的 actors。actor 和其他 actor 通过发送异步消息通信。每个 actor 有一个邮箱(mailbox),它收到的消息存储在里面。每个 actor 维护自身单独的状态。
下面是一个 Actors 网络:
每个 actor 是一个单一的线程,它不断地从它的邮箱中 poll 消息,并且不断地处理。对于已经处理过的消息的结果,actor 可以改变它自身的内部状态或者发送一个新消息或者孵化一个新的 actor。尽管单个的 actor 是