Flink中RPC实现原理简介

前提知识

Akka是一套可扩展、弹性和快速的系统,为此Flink基于Akka实现了一套内部的RPC通信框架;为此先对Akka进行了解

Akka

Akka是使用Scala语言编写的库,基于Actor模型提供一个用于构建可扩展、弹性、快速响应的系统;并被应用到Flink中,基于Akka实现了集群组件之间的RPC通信框架

Actor模型

Actor模型是一个通用的并发编程模型,该模型独立维护隔离状态,基于消息传递实现异步通信,大致可以理解为三部分:

  • 邮箱:每个actor持有一个邮箱(mailbox),本质上是一个队列,用于存储消息。
  • 行为:每个actor可以发送消息至任何actor
  • 状态:每个actor可以通过处理消息来更新内部状态,对于外部而言,actor的状态是隔离的状态,避免了并发环境下的锁和内存原子性问题

Akka系统组成

Akka系统核心包括两个组件:ActorSystemActor(使用demo可以参考这里

  • 只能通过ActorSystem.actorOfActorContext.actorOf创建Actor,不允许直接创建Actor
  • 只能通过ActorRef发送消息与Actor通信

Flink的RPC框架

Flink的RPC框架基于Akka实现,其中Flink集群中实现RPC通信节点功能主要有:DispacherResourceManagerTaskManagerTaskManager;这些节点分别继承了RpcEndPoint抽象类,并在实现类中初始化各自RpcServer(类似于Actor)来提供本地和远程代码请求;RpcServer的创建和启动都是由RpcService(主要实现AkkaRpcService,封装ActorSystem)来完成,此外一个RpcService可以创建多个RpcServer;详细的调用链路图如下所示

RpcEndPoint

RpcEndPoint代表RPC组件的端点,需要实现RPC通信的都需要实现RpcEndPoint,主要成员变量如下

  • rpcServer用于完成本地和远程调用能力

  • rpcService是的rpcService引用,rpcService可用于启动/关闭当前rpcServerrpcServer中封装了ActorRef

  • mainThreadExecutor封装了MainThreadExecutable接口(RpcServer接口继承了MainThreadExecutable),用于实现本地调用

  • endpointId用于唯一标识当前的RpcEndPoint

AkkaRpcService

AkkaRpcService负责创建启动Flink集群中RpcEndPoint组件的RpcServer,且AkkaRPCService在集群创建时就会启动完毕;UML类图如下所示

属性:

  • actorSystem是引用Akka的ActorSystem,可以用于启动、停止actor(启动、停止rpcServer
  • actors用于存储创建的RpcEndPoint的实现类(类中会封装actor

方法:

  • startServer()用于启动RpcServer,启动完成后这能对外提供服务
  • connect()用于连接远端RpcEndpoint,并返回调用方RpcGateway接口的代理类,获得调用外部的能力

RpcServer

RpcServer是一个接口类,该类实现类有AkkaInvocationHandlerFencedAkkaInvocationHandlerAkkaInvocationHandler中封装有ActorRef,并通过动态代理技术(InvocationHandler)实现远程和本地方法调用

RpcServerRpcGateWayMainThreadExecutableStartStoppable接口的方法,都会通过代理实现;方法中会查看调用方法实现类,来判断本地调用还是通过RefActor发送远程RPC调用

小结

Flink中每个需要使用RPC的组件都会实现RpcEndpoint,每个RpcEndpoin中都会包含两个属性RpcServiceRpcServer;其中RpcService封装了AkkaSystemRpcServer封装了ActorRef,最终通过动态代理技术实现方法的调用

参考资料:

书籍:Flink设计与实现

博客:https://cloud.tencent.com/developer/news/698662

相关推荐
lifallen13 小时前
Flink Checkpoint 流程、Barrier 流动与 RocksDB 排障
java·大数据·flink
lifallen16 小时前
一篇文章讲透 Flink State
大数据·数据库·python·flink
csgo打的菜又爱玩17 小时前
3.HAService启动流程解析
flink
绿豆人17 小时前
RPC项目学习2
网络协议·学习·rpc
恋喵大鲤鱼17 小时前
认识 RPC 的不同模式
rpc
大大大大晴天️18 小时前
Flink技术实践-FlinkSQL Join技术全解
大数据·flink
csgo打的菜又爱玩18 小时前
4.BlobServer 源码解析
大数据·架构·flink
tian_jiangnan19 小时前
flink mysql集群增删改查
大数据·mysql·flink
武子康20 小时前
大数据-268 实时数仓-ODS 层 Flink+Kafka+HBase实时流处理:Kafka数据写入维度表实战
大数据·后端·flink
渣渣盟2 天前
Flink流处理:温度跳变检测与状态管理
大数据·flink·scala