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提供他认 ...
随机推荐
- 4-1 R语言函数 lapply
#lapply函数 #可以循环处理列表中的每一个元素 #lapply(参数):lapply(列表,函数/函数名,其他参数) #总是返回一个列表 #sapply:简化结果 #结果列表元素长度均为1,返回 ...
- uva 12508 - Triangles in the Grid(几何+计数)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011328934/article/details/35244875 题目链接:uva 12508 ...
- Spring常用jar包的功能
jar名称 描述 spring-framework.jar spring框架比较完整的功能,core+aop+ioc+transaction spring-core.jar 基本上的核心工具类,一些u ...
- Java实现数据库操作
Java实现数据库操作 这里的样例是使用mysql数据库 代码实现 /* MySQLHelper.java */ import java.io.*; import java.util.*; impor ...
- SVN服务器安装与本地连接
SVN服务器安装与本地连接 系统环境 Centos7 查看是否安装了低版本SVN [root@svn-server ~]# rpm -qa subversion 卸载旧版本SVN [root@svn- ...
- Vue滚动加载自定义指令
用Vue在移动端做滚动加载,使用mint-ui框架, InfiniteScroll指令loadmore组件,在uc浏览器和qq浏览器都无法触发.无奈我只能自己写了. 决定用vue 的自定义指令 写滚动 ...
- [原创]关于在VS解决方案下使用文件夹管理多个项目层次关系的说明
由于所创建的应用项目或类库项目较多,于是将这些类库放到一个文件夹下.在VS解决方案下确实能看到一个文件夹下多个类库项目这种层次关系.如下图所示: 但打开“我的电脑”,看到的只有类库,并未看到维护层次关 ...
- boost::bind 学习
最近学习了太多与MacOS与Iphone相关的东西,因为不会有太多人有兴趣,学习的平台又是MacOS,不太喜欢MacOS下的输入法,所以写下来的东西少了很多. 等我学习的东西慢慢的与平台无关的时 ...
- java crm 进销存 springmvc SSM 项目 源码 系统
系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM ...
- iOS Class结构分析
objc_class结构体 类在OC中是objc_class的结构体指针 typedef struct objc_class *Class; 在objc/runtime.h中objc_class结构体 ...