Flink架构分析之RPC详解
主要抽象
Flink RPC 框架主要抽象了RpcService,RpcEndpoint,RpcGateway,RpcServer这几个接口,具体实现可以采用多种方式,比如:akka,netty
RpcService
我理解为RPC框架的引擎,可以用来启动、停止、连接一个RpcEndpoint,以及执行某些异步任务或者周期性调度任务。

主要方法:
connect:连接到一个RpcEndpoint,返回一个RpcGateway,然后调用者可以使用此gateway进行远程方法调用。startServer:启动一个RpcEndpoint,返回一个RpcServer。fenceRpcServer:获取新的RpcServer,可用于重新选主后,更新fencingToken。stopServer: 停止某个RpcEndpoint。scheduleRunnable:延迟调度执行某任务。execute:异步执行某任务。
RpcEndpoint
所有提供远程调用的组件都会继承此抽象类并实现组件自身提供的业务方法,并且保证同一个RpcEndpoint上的所有远程调用都在同一个线程中执行。
RpcGateway
用于远程调用RpcEndpoint的某些方法。可以理解为客服端代理。
RpcServer
RpcService的startServer返回的对象,相当于RpcEndpoint自身的代理对象(self gateway)。通过RpcEndpoint的getSelfGateway方法获取其自身的gateway对象然后调用该endpoint的方法。

akka实现
AkkaRpcService
基于akka实现的RpcService,其startServer可以创建一个Akka actor用于接收来自RpcGateway的远程调用消息。


AkkaRpcActor
akka actor 继承UntypedActor能处理RpcInvocation,RunAsync,CallAsync,ControlMessages,RemoteHandshakeMessage等业务消息。其包含了具体的RpcEndpoint,收到RpcInvocation后会调用具体实现类RpcEndpoint的相应方法。
private Method lookupRpcMethod(final String methodName, final Class<?>[] parameterTypes) throws NoSuchMethodException {
return rpcEndpoint.getClass().getMethod(methodName, parameterTypes);
}
rpcMethod = lookupRpcMethod(methodName, parameterTypes);
rpcMethod.setAccessible(true);
rpcMethod.invoke(rpcEndpoint, rpcInvocation.getArgs());
AkkaInvocationHandler
实现了java动态代理InvocationHandler接口,以及RpcServer和RpcGateway。AkkaRpcService的connect,startServer方法都会使用该类创建返回给调用者进行远程调用的代理对象。该类会引用akka的ActorRef并把远程过程调用包装为RpcInvocation消息发送给对应的AkkaRpcActor。

核心逻辑

注意RpcEndpoint启动时需要执行的业务逻辑应该重写其onStart回调方法:
protected RpcEndpoint(final RpcService rpcService, final String endpointId) {
this.rpcService = checkNotNull(rpcService, "rpcService");
this.endpointId = checkNotNull(endpointId, "endpointId");
//构造函数中已经创建好akka actor
this.rpcServer = rpcService.startServer(this);
this.mainThreadExecutor = new MainThreadExecutor(rpcServer, this::validateRunsInMainThread);
}
// start方法调用rpcServer的start方法
public final void start() {
rpcServer.start();
}
// 用户实现的启动时执行的回调方法
public void onStart() throws Exception {}
在akka是实现中rpcServer发消息给actor通知其改变状态开始处理远程调用
@Override
public void start() {
rpcEndpoint.tell(ControlMessages.START, ActorRef.noSender());
}
实例讲解之Dispatcher
DispatcherGateway
对外提供了一些列管理job的接口,比如提交jobsubmitJob,查询job列表listJobs等。

Dispatcher

重载了onStart方法,启动了JobGraphStore监听器,master选举服务,注册了一个统计正在运行的job数量的metric
然后就是实现具体的业务逻辑,比如submitJob:

Flink架构分析之RPC详解的更多相关文章
- tomcat架构分析及配置详解
浏览器访问服务器的流程 请求发起的过程: 注意:浏览器访问服务器使用的是http协议,http是应用层协议,而具体传输还是使用的TCP/IP协议 Tomcat系统总架构 2.1 Tomcat请求处理过 ...
- 【集合框架】JDK1.8源码分析之ArrayList详解(一)
[集合框架]JDK1.8源码分析之ArrayList详解(一) 一. 从ArrayList字表面推测 ArrayList类的命名是由Array和List单词组合而成,Array的中文意思是数组,Lis ...
- Android Telephony分析(五) ---- TelephonyRegistry详解
本文紧接着上一篇文章<Android Telephony分析(四) —- TelephonyManager详解 >的1.4小节.从TelephonyRegistry的大部分方法中: 可以看 ...
- Android Telephony分析(三) ---- RILJ详解
前言 本文主要讲解RILJ工作原理,以便更好地分析代码,分析业务的流程.这里说的RILJ指的是RIL.java (frameworks\opt\telephony\src\java\com\andro ...
- Android Telephony分析(二) ---- RegistrantList详解
前言 本文主要讲解RegistrantList的原理,以及如何快速分析RegistrantList相关的代码流程.在Telephony模块中,在RIL.Tracker(ServiceStateTrac ...
- nginx源码分析线程池详解
nginx源码分析线程池详解 一.前言 nginx是采用多进程模型,master和worker之间主要通过pipe管道的方式进行通信,多进程的优势就在于各个进程互不影响.但是经常会有人问道,n ...
- Flink架构分析之Standalone模式启动流程
概述 FLIP6 对Flink架构进行了改进,引入了Dispatcher组件集成了所有任务共享的一些组件:SubmittedJobGraphStore,LibraryCacheManager等,为了保 ...
- openfalcon架构及相关服务配置详解
一:openfalcon组件 1.falcon-agent 数据采集组件 agent内置了一个http接口,会自动采集预先定义的各种采集项,每隔60秒,push到transfer. 2.transfe ...
- explain分析SQL语句详解
性能分析explain MySql Query Optimizer是MySql中专门负责优化select语句的优化器模块,主要功能:通过计算分析系统中收集到的系统信息,为客户端请求的Query提供他认 ...
随机推荐
- ubuntu16.04中安装下载工具uget+aria2并配置chrome (stable版)
1.安装uGut sudo apt-get install uget 2.安装aria2 sudo apt-get install arias 3.配置uGet默认下载插件为aria2 菜单栏依次打开 ...
- Day4 数组
双重for循环 外循环控制行,内循环控制列. //乘法表 ; i <= ; i++) { ; j <= i ;j++) { System.out.print(j+"*" ...
- js如何将时间戳转换为标准时间
function formatDate(date,fmt){ let o = { 'M+' : date.getMonth() +1, //月份 'd+' : date.getDate(), //日 ...
- 横向滑动页面,导航条滑动居中的 js 实现思路
最近在做新闻咨询页的项目,各个新闻频道通过横向滑动切换,顶部的导航active栏需要跟着切换到对应频道,并且active到达中部时,要一直处在中间. 类似效果就是uc浏览器<UC头条>的导 ...
- django用户验证机制
django的验证机制 from django.contrib.auth.decorators import login_required 需要在要验证的界面添加`@login_required` 登 ...
- 12 Bit ADC与LSB的含义
[转]12 Bit ADC与LSB的含义 LSB(Least Significant Bit),意为最低有效位:MSB(Most Significant Bit),意为最高有效位,若MSB=1,则表示 ...
- 浅谈基于FormsAuthentication的认证
一般情况下,在我们做访问权限管理的时候,会把用户的正确登录后的基本信息保存在Session中,以后用户每次请求页面或接口数据的时候,拿到 Session中存储的用户基本信息,查看比较他有没有登录和能否 ...
- 【OC底层】AssociatedObject 关联对象
如何实现给分类“添加成员变量”? 默认情况下,因为分类底层结构的限制,不能添加成员变量到分类中.但可以通过关联对象来间接实现 关联对象提供了以下API 1> 添加关联对象 void objc_s ...
- laravel 5.5 《电商实战 》安装应用
最近开始接触电商业务.公司打算采用lavarel做后端的开发,出于学习成本和时间的考虑.自己找到了一个不错的收费教程.这段时间会同步更新,分享自己的学习过程. 自己的开发环境,mac+nginx+my ...
- react-native使用redux 存在的坑
前几天安卓真机测试的时候,突然发现一个严重的问题. 后退两次退出应用,再开启白屏.而杀掉进程后再开启就是好的. 这个重大bug我跟了好久,以为是splash-screen的问题. 后来一点一点打con ...