首页 > 其他分享 >深度了解flink rpc机制(三)-组件以及交互

深度了解flink rpc机制(三)-组件以及交互

时间:2024-10-22 21:16:53浏览次数:3  
标签:flink Flink RPC RpcService rpc 调用 消息 组件

Flink RPC 整体架构

Flink集群间组件的通信底层是使用的actor system通信模型和动态代理来实现的,先简单看下Flink RPC相关的类UML图

通信组件

RpcGateway

Flink RPC远程调用网关,是Flink RPC定义远程调用的接口协议,对外提供可调用的接口,所有实现RPC的组件,都要实现这个接口

从RpcGateway继承关系看,Flink的核心组件各自都有相关RpcGateway接口对外接口的实现,组件之间的通信都是通过RpcGateway进行交互的。

FencedRpcGateWay是用于解决集群脑裂问题的,JobMaster、ResourceManager、Dispatcher在高可用的模式下,涉及Leader的选举,可能导致集群脑裂,所以这几个组件都要实现FencedRpcGateWay这个接口。

EndPoint

Endpoint实现了RpcGateway接口,在RpcGateway的基础上提供了RPC服务组件的生命周期管理,Flink中涉及到RPC通信的组件,都要继承Endpoint。

在Flink的设计中,同一个RpcEndpoint中的所有调用只有一个线程来处理,叫做Endpoint主线程,与Actor模型一样,所有对状态数据的修改在同一个线程中执行,所以不存在并发问题。

RpcService

RpcService是Endpoint的成员变量,作用如下:

  1. 启动和停止RpcServer、连接RpcEndpoint
  2. 根据指定的连接地址,连接到RpcServer会返回一个RpcGateway。分为带FencingToken和不带Token的版本
  3. 延迟\立刻调度Runnable和Callable

RpcService会在ClusterEntrypoint(JobMaster)和TaskManagerRunner(TaskExecutor)启动的过程中初始化启动


private RpcService commonRpcService;
ClusterEntrypoint .runCluster ->
initializeServices ->
commonRpcService =
RpcUtils.createRemoteRpcService(
    rpcSystem,
    configuration,
    configuration.get(JobManagerOptions.ADDRESS),
    getRPCPortRange(configuration),
    configuration.get(JobManagerOptions.BIND_HOST),
    configuration.getOptional(JobManagerOptions.RPC_BIND_PORT));

PekkoRpcServie是RpcService的唯一实现,PekkoRpcService中包含了一个Actor System,内部提供了RpcServer的创建和启动(自身代理),保存了ActorRef和RpcEndpoint之间的映射关系(其他组件的代理)。RpcService会根据Endpoint类型的不同(Fenced和非Fenced),构建不同的ActorRef(Fenced和非Fenced),并保存RpcActor和Endpoint的关系,创建出来的RpcActor是底层调用的实际接收者,Rpc的请求在客户端封装成RpcInvocation对象,以Pekko/Akka消息的形式发送.

public interface RpcService extends AutoCloseableAsync {
    //xxxx省略其他方法
    /**
    * 获取自身代理对象    
    */
    <C extends RpcGateway> C getSelfGateway(Class<C> selfGatewayType, RpcServer rpcServer);
    //连接远程rpc服务,返回远程代理对象
    <C extends RpcGateway> CompletableFuture<C> connect(String address, Class<C> clazz);
    <F extends Serializable, C extends FencedRpcGateway<F>> CompletableFuture<C> connect(
            String address, F fencingToken, Class<C> clazz);
}

RpcServer

RpcServer是Rpcendpoint的成员变量,负责接收远端Rpc消息请求。其中有两个实现:PekkoInvocationHandler和FencedPekkoInvocationHandler

RpcServer的启动实质上通知自身的RpcActor切换到START状态(状态初始化为STOP),然后开始处理远程的请求

AkkaRpcActor/PekkoRpcActor

Flink集群内部的通信依赖于Pekko(Akka的一个开源分支),PekkoRpcActor是其具体实现,用来接收Rpc的请求和发送消息,负责处理如下几类消息:

  1. 本地Rpc调用用LocalRpcInvocation

LocalRpcInvocation类型的调用指派给RpcEndpoint进行处理,如果有结果响应,则将响应结果返回至sender

  1. RunAsync&CallAsync

RunAsync和CallAsync 类型的消息带有可执行的代码,直接在Actor的线程执行

  1. 控制类消息 ControllerMessage

ControllerMessage用来控制Actor的行为,ControllerMessags#START启动Actor开始处理消息,Controller#STOP停止处理消息

PekkoRpcServer在RpcService.startServer() 中被创建

AkkaInvocationHandler/PekkoInvocation

继承了InvocationHandler接口,用于生成动态代理的实例,PekkoInvocationHandler类实现了InvocationHandler并实现invoke方法,是将代理类的方法,参数类型,参数封装为RpcInvocation对象,之后通过Pekko.tell 、Pekko.ask方法将RpcInvocation作为消息发送到代理接口所在的进程中。

Flink RPC交互流程

Flink不同组件之间在运行时,需要频繁的进行RPC通信,如JobMaster向TaskManager发送Task,JobMaster向ResourceManager请求Slot资源等,在底层的RPC分为请求和响应两类

RPC请求发送

RPC消息是通过RpcEndpoint的RpcService绑定的ActorRef发送的,以下是请求发送的流程:

  1. RpcServer中调用connect()方法与对端的Endpoint进行连接,connect方法根据给的地址返回InvocationHandler代理接口的代理对象(PekkoInvocationHandler或者FencedPekkoInvocationHandler的实例)
  2. 调用代理对象invok方法并传入RPC调用的方法和参数信息
  3. 代理对象的invoke方法进行判断:如果是RPC方法,则调用invokeRpc方法,将方法封装成RpcInvocation消息。如果是本地则生成LocalRpcInvocation,本地消息不需要序列化,如果是远程则封装成RemoteRpcInvocation
  4. 判断远程方法是否需要等待结果,如果无需等待(void),则使用Actor tell发送消息,如果需要等待返回,则使用Actor的ask发送消息

RPC请求响应

PekkoRpcActor是消息接收的入口,负责将消息交给不同的放法进行处理,代码如下:

   @Override
    public Receive createReceive() {
        return ReceiveBuilder.create()
                 //握手消息
                .match(RemoteHandshakeMessage.class, this::handleHandshakeMessage)
                 //控制消息
                .match(ControlMessages.class, this::handleControlMessage)
                 //RPC消息
                .matchAny(this::handleMessage)
                .build();
    }

PekkoRpcActor收到消息有3种处理方式:

  1. 握手消息

在客户端构造时会通过ActorSelection传过来,用于确定server侧是否正常

  1. 控制消息

例如,RpcEndpoint调用start方法后,会向自身发送一条Processing.START消息转换当前Actor的状态

  1. RPC消息

通过解析RpcInvocation获取方法名和参数类型,并从RpcEndpoint类中找到Method对象,通过反射调用该方法,如果有返回结果,会以Akka消息的形式发送回发送者。

总结

Flink集群内部通信框架的最低层依赖Akka/Pekko,定义了不同类型的消息,并且设计了通用的RPC通信组件,使用了动态代理进行接口管理,利于扩展维护。

标签:flink,Flink,RPC,RpcService,rpc,调用,消息,组件
From: https://blog.csdn.net/qq_40689430/article/details/143135266

相关文章

  • go grpc默认长连接
    google.golang.org/grpcv1.66.0conn,err:=grpc.NewClient("127.0.0.1:1000",grpc.WithTransportCredentials(insecure.NewCredentials()))启动后就会看到该连接。创建grpcclient,默认指定idleTimeout是30分钟。keepalive.ClientParametersTime表示建连多久之后,无grpc数......
  • Jetpack架构组件_LiveData组件
    1.LiveData初识LiveData:ViewModel管理要展示的数据(VM层类似于原MVP中的P层),处理业务逻辑,比如调用服务器的登陆接口业务。通过LiveData观察者模式,只要数据的值发生了改变,就会自动通知VIEW层,View层会设置观察者来监听数据的改变。MVP:P调用M层去获取数据,P回调View层实现的接口,......
  • vue3 使用swiper轮播组件
    1.本地环境信息参考node版本:nodejs:v18.20.4npm:10.7.0vue版本"dependencies":{"vue":"^3.2.13",...}2.安装swiper依赖执行命令:npmiswiper安装后,查看工程中的package.json文件,新增了swiper依赖(默认最新版):"dependencies":{......
  • Windows Installer核心clbcatq.dll丢失?找回Windows Installer关键组件clbcatq.dll的修
    在Windows操作系统中,clbcatq.dll是WindowsInstaller服务的一个关键组件,它负责处理与安装、配置和删除WindowsInstaller包(.msi文件)相关的任务。如果clbcatq.dll文件丢失或损坏,可能会导致WindowsInstaller无法正常工作,进而影响软件的安装、更新和卸载。如果你遇到了clbcatq.dl......
  • 组件封装-双el-select联动搜索-实现方案&经验分享
    前情提要:    最近业务中需要实现产品与设备的联动搜索功能,需要两个el-select框,并且每个Select框是支持筛选的,毕竟设备和产品数量较多。这个功能在之前迭代的模块中实现过,但是并没有封装成为组件,现在要开发一个新的业务,其中”产品+设备“的联动搜索效果应用场景还有很......
  • 3D渲染所需的关键组件和技能,及云渲染技术帮助!
    3D渲染的世界中,一个明确定义的过程对于实现令人惊叹的成果至关重要。本节探讨了影响渲染工作流程的关键组成部分,从高分辨率输出所需的时间投入到掌握行业标准软件所需的多样化技能集,为成功项目奠定了基础。一、3D渲染的所需关键工作1、时间投入和工作流程效率实现高质量的渲染......
  • 《花100块做个摸鱼小网站! 》第八篇—增加词云组件和搜索组件
    ⭐️基础链接导航⭐️服务器→☁️阿里云活动地址看样例→......
  • 使用Radzen Blazor组件库开发的基于ABP框架炫酷UI主题
    一、项目简介使用过ABP框架的童鞋应该知道它也自带了一款免费的BlazorUI主题,它的页面是长这样的:个人感觉不太美观,于是网上搜了很多Blazor开源组件库,发现有一款样式非常不错的组件库,名叫:Radzen,它的组件库案例网址是:SampleBlazorDashboard|FreeUIComponentsbyRadzen,比较......
  • 原生小程序开发拓展能力组件|拓展组件库汇总(五)
    DialogDialog弹窗组件。开发建议客户端有提供会话框的api调用方式,如无特别业务定制需求,推荐优先使用ty.showModal属性列表属性类型默认值必填说明ext-classstring否添加在组件内部结构的class,可用于修改组件内部的样式titlestring否弹窗的标题buttonsarray[]否......
  • vue2组件
    模块和组件的区别1、模块化从代码逻辑的角度划分;方便代码分层开发,保证每个功能模块的职能单一2、组件化从UI界面的角度划分;前端的组件化,方便UI组件的重用父子组件传参1、父传子1、在父组件的子标签中自定义一个属性2、在子组件中使用props接收参数2、子传父1、在......