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提供他认 ...
随机推荐
- Linux系统 开通防火墙端口
Redhat 7内核 Linux系统 开通防火墙端口 使用systemctl 1.查看防火墙状态,root用户登录,执行命令systemctl status firewalld 2.开启防火墙:sy ...
- 1305. [CQOI2009]跳舞【最大流+二分】
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- 禁止 "启动时恢复任何注册的应用程序"
在关闭计算机时 有些程序会进行注册 并在下次启动时恢复关闭前的状态(Restart Manager) 比如Chrome浏览器 应用程序实现这一功能可以调用RegisterApplicationRest ...
- Ubuntu16.04如何彻底删除Apache2
虽然作为运维人员通常情况不建议随意删除Linux系统上面的任何软件,主要指生产环境下,测试环境也不能太随意. 但是有的时候,比如系统环境要变一变,我们就需要替换一些淘汰的软件,对此我们一般都会删除. ...
- 初识Qt文件下载
1.新建一个Qt Gui应用,项目名称为http,基类选择为QMainWindow,类名设置为MainWindow. 2.在http.pro文件中的QT += core gui后添加\ networ ...
- Selenium 设置代理chrome
1.1. 连接无用户名密码认证的代理 from selenium import webdriver chromeOptions = webdriver.ChromeOptions() chromeOp ...
- Spring源码分析(十三)缓存中获取单例bean
摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 介绍过FactoryBean的用法后,我们就可以了解bean加载的过程了 ...
- bat取时间间隔
@echo off echo 现在时间是%time:~,%点%time:~,%分%time:~,%秒 ,%%time:~,%%time:~,% pause echo 现在时间是%time:~,%点%t ...
- php基础知识考察点:正则表达式
1.正则表达式的作用:分割,查找,匹配,替换 字符串 2.分隔符:正斜线(/),hash符(#)以及取反符号(~). 3.通用原子:\d \D \s \S \w \W 4.原子符 5. 模式修正符 6 ...
- 大数据调错系列之:自己总结的myeclipse连接hadoop会出现的问题
在我们学习或者工作中开始hadoop程序的时候,往往会遇到一个问题,我们写好的程序需要打成包放在集群中运行,这无形中在浪费我们的时间,因为程序可以需要不断的调试,然后把最终程序放在集群中即可.为了解决 ...