流行的网站开发语言,四川省凉亭建设工程有限公司网站,wordpress 会员收费,企业网站建设方案新闻Flink是一个典型的Master/Slave分布式实时处理系统#xff0c;分布式系统组件之间必然涉及通信#xff0c;也即RPC#xff0c;以下图展示Flink组件之间的关系#xff1a;
RPCGateWay
一般RPC框架可根据用户业务类生成客户端和服务器端通信底层代码#xff0c;此时只需定…Flink是一个典型的Master/Slave分布式实时处理系统分布式系统组件之间必然涉及通信也即RPC以下图展示Flink组件之间的关系
RPCGateWay
一般RPC框架可根据用户业务类生成客户端和服务器端通信底层代码此时只需定义业务类接口以及实现接口的业务逻辑网络通信以及序列化反序列化这些繁琐的细节有框架屏蔽flink中也是类似的原理业务接口被抽象为RpcGateway, 比如
DispatcherGateway接受客户端的请求比如提交JobGraph,查询Job信息、触发Savepoint等JobMasterGateway包含一个Job的元信息调度执行JobResourceManagerGateway保存资源分配信息主要是TaskManager中Slot分配情况TaskExecutorGatewayTaskManager核心功能比如分配释放Slot、执行TaskMetricQueryServiceGateway提供查询Metric功能
这些接口的具体实现就是组件提供的核心功能
RPCEndPoint
组件间通信基于Actor, 负责RPC通信功能则被抽象成一个RPCEndPoint RPCEndPoint将通信细节委托给一个全局RpcService,在RPCEndPoint构造时需传递一个RpcService实例,RpcService提供startServer/connect两个核心接口具体实现为AkkaRpcService, 调用RpcService.startServer(RPCEndPoint)就会生成一个封装了RPCEndPoint的AkkaRpcActor, 该Actor可接受消息提供RPC服务
如果要与其他组件通信则调用RpcService.connect(RpcGateway)获取一个可与远程Actor通信的Client该Client是一个实现了RpcGateway的动态代理类动态代理类内部通过AkkaInvocationHandler序列化RPC消息发送给其他Actor, 从而实现这个RPC过程
整个过程有以下几个核心类
AkkaRpcService, 生成与其他组件进行通信的代理客户端以及启动一个AkkaRpcActor服务AkkaRpcActor, RPC服务端核心类接受远程过程调用消息反射调用RPCEndPoint的业务逻辑AkkaInvocationHandler, RPC客户端核心类发送消息给本地AkkaRpcActor或序列化RPC消息, 发送给远程AkkaRpcActorRpcInvocation封装RPC消息
Component
RpcEndPoint构造函数如下
protected RpcEndpoint(final RpcService rpcService, final String endpointId) {this.rpcService checkNotNull(rpcService, rpcService);this.endpointId checkNotNull(endpointId, endpointId);this.rpcServer rpcService.startServer(this); //核心this.mainThreadExecutor new MainThreadExecutor(rpcServer, this::validateRunsInMainThread);
}构造时传递一个RpcService, 同时会调用RpcService.startServer(this)方法,返回一个RPCServer实例这样就将当前实例封装成一个AkkaRpcActor这个Actor既能对外提供RPC服务也能在本地通过返回的RpcServer向这个Actor发送消息。
因此实现一个具体的Component只要同时继承RpcGateway和RpcEndPoint就能实现将RpcGateway的业务接口暴露出去提供远程服务在JobManager/TaskManger启动过程中都是先创建一个RpcService实例然后new出各个业务组件实例这样各个组件完成初始化后就能各司其职协调配合完成具体业务功能。
JobManager启动时两个核心组件
StandaloneDispatcher, 实现了DispatcherGatewayStandaloneResourceManager, 实现了ResourceManagerGateway
TaskManger启动时核心组件:
TaskExecutor, 实现了TaskExecutorGateway
源码中继承关系很容易看出它们都是继承自RpcEndPoint同时实现某个RpcGateWay接口。