主要抽象

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

RpcServicestartServer返回的对象,相当于RpcEndpoint自身的代理对象(self gateway)。通过RpcEndpointgetSelfGateway方法获取其自身的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接口,以及RpcServerRpcGatewayAkkaRpcServiceconnect,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详解的更多相关文章

  1. tomcat架构分析及配置详解

    浏览器访问服务器的流程 请求发起的过程: 注意:浏览器访问服务器使用的是http协议,http是应用层协议,而具体传输还是使用的TCP/IP协议 Tomcat系统总架构 2.1 Tomcat请求处理过 ...

  2. 【集合框架】JDK1.8源码分析之ArrayList详解(一)

    [集合框架]JDK1.8源码分析之ArrayList详解(一) 一. 从ArrayList字表面推测 ArrayList类的命名是由Array和List单词组合而成,Array的中文意思是数组,Lis ...

  3. Android Telephony分析(五) ---- TelephonyRegistry详解

    本文紧接着上一篇文章<Android Telephony分析(四) —- TelephonyManager详解 >的1.4小节.从TelephonyRegistry的大部分方法中: 可以看 ...

  4. Android Telephony分析(三) ---- RILJ详解

    前言 本文主要讲解RILJ工作原理,以便更好地分析代码,分析业务的流程.这里说的RILJ指的是RIL.java (frameworks\opt\telephony\src\java\com\andro ...

  5. Android Telephony分析(二) ---- RegistrantList详解

    前言 本文主要讲解RegistrantList的原理,以及如何快速分析RegistrantList相关的代码流程.在Telephony模块中,在RIL.Tracker(ServiceStateTrac ...

  6. nginx源码分析线程池详解

    nginx源码分析线程池详解 一.前言     nginx是采用多进程模型,master和worker之间主要通过pipe管道的方式进行通信,多进程的优势就在于各个进程互不影响.但是经常会有人问道,n ...

  7. Flink架构分析之Standalone模式启动流程

    概述 FLIP6 对Flink架构进行了改进,引入了Dispatcher组件集成了所有任务共享的一些组件:SubmittedJobGraphStore,LibraryCacheManager等,为了保 ...

  8. openfalcon架构及相关服务配置详解

    一:openfalcon组件 1.falcon-agent 数据采集组件 agent内置了一个http接口,会自动采集预先定义的各种采集项,每隔60秒,push到transfer. 2.transfe ...

  9. explain分析SQL语句详解

    性能分析explain MySql Query Optimizer是MySql中专门负责优化select语句的优化器模块,主要功能:通过计算分析系统中收集到的系统信息,为客户端请求的Query提供他认 ...

随机推荐

  1. prometheus-入门尝试

    prometheus-入门 Prometheus 是由 SoundCloud 开源监控告警解决方案2015 年在 github 上开源以来,已经吸引了 很多大公司的使用:2016 年 Promethe ...

  2. programming-languages学习笔记--第8部分

    programming-languages学习笔记–第8部分 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src ...

  3. net::ERR_CONNECTION_RESET 报错原因

    1>  向tomcat 服务器上上传视频, 谷歌浏览器控制台报出: 打开信地址栏后 发现: net::ERR_CONNECTION_RESET 错误, 但是此视频以经过mp4转码(注: 浏览器支 ...

  4. 配虚拟ip脚本

    cat /home/master/init_pandora.sh #! /bin/shuser=`whoami`if [ $user = 'master' ]then sudo /sbin/ifcon ...

  5. Xcode下载模拟器太慢?

    在Xcode里下载模拟器,速度实在是太慢了.点击下载,卡住十几分钟才开始下载,并且龟速进行. 解决方案:获取模拟器下载地址,自己选择下载器进行下载. 找到下载链接 打开 Console.app(苹果电 ...

  6. MySql优化分析

    原理 MYSQL逻辑分层 :连接层 服务层 引擎层 存储层 InnoDB(默认) :事务优先 (适合高并发操作:行锁) MyISAM :性能优先 (表锁) SQL优化 编写过程: sql select ...

  7. layui水平导航条三级

    需求 需要做一个顶部的水平导航条,有三级,展开的时候二级和三级一起展开,结果如图: 效果 一级菜单 二级标题   三级菜单 三级菜单 二级标题   三级菜单 三级菜单 一级菜单 二级标题   三级菜单 ...

  8. d3 js emberjs handlerbarjs

    http://handlebarsjs.com/ http://emberjs.com/ http://jsbin.com/d3ember-barchart/13/edit?html,output

  9. winform 自定义控件:半透明Loading控件

    winform  自定义控件:半透明Loading控件 by wgscd date:2015-05-05 效果: using System;using System.Drawing;using Sys ...

  10. WPF字体模糊解决方案

    原文:WPF字体模糊解决方案 WPF对字体渲染做了很大的改善,与Winform窗体字体相比较,更加平滑,但是当字体大小较小时,则会出现字体模糊的现象.可通过以下方法进行改善处理: 对于XAML用户界面 ...