【Flink网络通讯(一)】Flink RPC框架的整体设计

文章目录

  • 1. Akka基本概念与Actor模型
  • 2. Akka相关demo
    • 2.1. 创建Akka系统
    • 2.2. 根据path获取Actor并与之通讯
  • 3. Flink RPC框架与Akka的关系
  • 4.运行时RPC整体架构设计
  • 5. RpcEndpoint的设计与实现

我们从整体的角度看一下Flink RPC通信框架的设计与实现,了解其底层Akka通信框架的基础概念及二者之间的关系。

 

1. Akka基本概念与Actor模型

Akka是使用Scala语言编写的库,用于在JVM上简化编写具有可容错、高可伸缩性的Java或Scala的Actor模型。Akka基于Actor模型,提供了一个用于构建可扩展、弹性、快速响应的应用程序的平台。

Actor 模型是一种并发计算模型,Actor 模型的核心思想是将计算单元抽象为独立的并发实体,称为 “actors”,这些 actors 之间通过消息传递进行通信。

以下是 Actor 模型的一些关键概念:

  1. Actor:Actor 是计算模型的基本执行单元。每个 Actor 都有自己的状态、行为和邮箱(用于接收消息)。Actor 之间是相互独立的,它们通过消息传递进行通信。
  2. 消息传递:在 Actor 模型中,通信是通过消息传递来实现的。一个 Actor 可以向另一个 Actor 发送消息,消息包含了要执行的操作或者改变状态的请求。这种异步消息传递使得系统更具有弹性和可伸缩性。
  3. 地址:每个 Actor 都有一个唯一的地址,用于唯一标识该 Actor。其他 Actor 可以使用地址向目标 Actor 发送消息。
  4. 邮箱:每个 Actor 都有一个邮箱,用于存储接收到的消息。Actor 处理消息的速度可能不同,但由于消息传递是异步的,这不会阻塞发送者。
  5. 行为:Actor 的行为定义了对消息的响应方式,包括状态的修改、消息的处理等。行为可以随着时间和接收到的消息而动态变化。

 

Actor由状态(State)、行为(Behavior)和邮箱(Mailbox)三部分组成。

actors和其他actors通过发送异步消息通信。Actor模型的强大来自于异步。它也可以显式等待响应,这使得可以执行同步操作。但是,强烈不建议同步消息,因为它们限制了系统的伸缩性(?怎么实现的伸缩性)。

actor系统
在这里插入图片描述

每个actor是一个单一的线程,它不断地从其邮箱中poll(拉取)消息,并且连续不断地处理。对于已经处理过的消息的结果,actor可以改变它自身的内部状态或者发送一个新消息或者孵化一个新的actor

 

2. Akka相关demo

2.1. 创建Akka系统

Akka系统的核心组件包括ActorSystem和Actor,构建一个Akka系统,首先需要创建ActorSystem,然后通过ActorSystem创建Actor。

需要注意的是:

  • Akka不允许直接创建Actor实例,只能通过ActorSystem.actorOf和ActorContext.actorOf等特定接口创建Actor。
  • 只能通过ActorRef与Actor进行通信,ActorRef对原生Actor实例做了良好的封装,外界不能随意修改其内部状态。

如代码所示,Akka系统中包含了创建ActorSystem以及Actor的基本实例。

// 1. 构建ActorSystem
// 使用缺省配置
ActorSystem system = ActorSystem.create("sys");
// 也可显示指定appsys配置
// ActorSystem system1 = ActorSystem.create("helloakka", ConfigFactory.load("appsys"));

// 2. 构建Actor,获取该Actor的引用,即ActorRef
ActorRef helloActor = system.actorOf(Props.create(HelloActor.class), "helloActor");

// 3. 给helloActor发送消息
helloActor.tell("hello helloActor", ActorRef.noSender());

// 4. 关闭ActorSystem
system.terminate();

在Akka中,创建的每个Actor都有自己的路径,该路径遵循 ActorSystem 的层级结构,大致如下:

本地:akka://sys/user/helloActor
远程:akka.tcp://sys@l27.0.0.1:2020/user/remoteActor   




- sys,创建的ActorSystem的名字;
- user,通过ActorSystem#actorOf和ActorContext#actorOf 方法创建的 Actor 都属于/user下,其是系统层面创建的,与系统整体行为有关,在开发阶段并不需要对其过多关注;
- helloActor,我们创建的HelloActor。

其中远程部分路径含义如下:

- akka.tcp,远程通信方式为tcp;
- sys@127.0.0.1:2020,ActorSystem名字及远程主机ip和端口号。

 

2.2. 根据path获取Actor并与之通讯

若提供了Actor的路径,可以通过路径获取到ActorRef,然后与之通信,代码如下所示:

ActorSystem system = ActorSystem.create("sys")ActorSelection as = system.actorSelection("/path/to/actor");

Timeout timeout = new Timeout(Duration.create(2, "seconds"));
Future<ActorRef> fu = as.resolveOne(timeout);

fu.onSuccess(new OnSuccess<ActorRef>() {
    @Override
    public void onSuccess(ActorRef actor) {
        System.out.println("actor:" + actor);
        actor.tell("hello actor", ActorRef.noSender());
    }
}, system.dispatcher());

fu.onFailure(new OnFailure() {
    @Override
    public void onFailure(Throwable failure) {
        System.out.println("failure:" + failure);
    }
}, system.dispatcher());


 

3. Flink RPC框架与Akka的关系

Flink进行RPC通信的组件

如图所示,从Flink RPC节点关系中可以看出,集群运行时中实现了RPC通信节点功能的主要有Dispatcher、ResourceManager和TaskManager以及JobMaster等组件。
借助RPC通信,这些组件共同参与任务提交及运行的整个流程,例如通过客户端向Dispatcher服务提交JobGraph,JobManager向TaskManager提交Task请求,以及TaskManager向JobManager更新Task执行状态等。

在这里插入图片描述

通过AkkaRpcService实现远程通讯能力

从图中也可以看出,集群的RPC服务组件是(1)RpcEndpoint,每个RpcEndpoint包含一个内置的RpcServer负责执行本地和远程的代码请求,(2)RpcServer对应Akka中的Actor实例。RpcEndpoint中创建和启动RpcServer主要是基于集群中的(3)RpcService实现,(4)RpcService的主要实现是AkkaRpcService。
 
从图可以看出,AkkaRpcService将Akka中的ActorSystem进行封装,通过AkkaRpcService可以创建RpcEndpoint中的RpcServer,同时基于AkkaRpcService提供的connect()方法与远程RpcServer建立RPC连接,提供远程进程调用的能力。

 

4.运行时RPC整体架构设计

Flink的RPC框架设计非常复杂,除了基于Akka构建了底层通信系统之外,还会使用JDK动态代理构建RpcGateway接口的代理类。

在这里插入图片描述

Flink RPC UML关系图

这里我们简单梳理一下RPC架构涉及的组件以及每种组件的作用。

  1. 集群RPC组件的基本实现类:

RpcEndpoint提供了集群RPC组件的基本实现,所有需要实现RPC服务的组件都会继承RpcEndpoint抽象类。
RpcEndpoint中包含了endpointId,用于唯一标记当前的RPC节点。RpcEndpoint借助RpcService启动内部RpcServer,之后通过RpcServer完成本地和远程线程执行。

  1. 基本实现类与FencedToken对比

对于RpcEndpoint来讲,底层主要有FencedRpcEndpoint基本实现类。
实现FencedRpcEndpoint的RPC节点都会有自己的FencedToken,当进行远程RPC调用时,会对比访问者分配的FencedToken和被访问者的FencedToken,结果一致才会进行后续操作。

  1. RpcEndpoint的实现类有TaskExecutor组件,FencedRpcEndpoint的实现类有Dispatcher、JobMaster以及ResourceManager等组件。这些组件可以获取RpcService中ActorSystem的dispatcher服务,并直接通过dispatcher创建Task线程实例
  2. RpcService提供了创建和启动RpcServer的方法。

在启动RpcServer的过程中,通过RpcEndpoint的地址创建Akka Actor实例,并基于Actor实例构建RpcServer接口的动态代理类,向RpcServer的主线程中提交Runnable以及Callable线程等。
同时在RpcService中提供了连接远程RpcEndpoint的方法,并创建了相应RpcGateway接口的动态代理类,用于执行远程RPC请求。

  1. RpcServer接口通过AkkaInvocationHandler动态代理类实现,所有远程或本地的执行请求最终都会转换到AkkaInvocationHandler代理类中执行。

AkkaInvocationHandler实现了MainThreadExecutable接口,提供了runAsync(Runnable runnable)以及callAsync(Callable<V> callable, Time callTimeout)等在主线程中执行代码块的功能。例如在TaskExecutor中释放Slot资源时,会调用runAsync()方法将freeSlotInternal()方法提交到TaskExecutor对应的RpcServer中运行,此时就会调用AkkaInvocationHandler在主线程中执行任务.

 

5. RpcEndpoint的设计与实现

RpcEndpoint是集群中RPC组件的端点,每个RpcEndpoint都对应一个由endpointId和actorSystem确定的路径,且该路径对应同一个Akka Actor。

如图,所有需要实现RPC通信的集群组件都会继承RpcEndpoint抽象类,例如TaskExecutor、Dispatcher以及ResourceManager组件服务,还包括根据JobGraph动态创建和启动的JobMaster服务。
在这里插入图片描述

从图中我们可以看出,RpcEndpoint实现了RpcGateway和AutoCloseableAsync两个接口,其中 RpcGateway 提供了动态获取RpcEndpoint中Akka地址和HostName的方法。

因为JobMaster组件在任务启动时才会获取Akka中ActorSystem分配的地址信息,所以借助RpcGateway接口提供的方法就能获取Akka相关连接信息。

 
RpcEndpoint中包含RpcService、RpcServer以及MainThreadExecutor三个重要的成员变量,其中

  • RpcService是RpcEndpoint的后台管理服务
  • RpcServer是RpcEndpoint的内部服务类
  • MainThreadExecutor封装了MainThreadExecutable接口,其主要底层实现是AkkaInvocationHandler代理类。所有本地和远程的RpcGateway执行请求都会通过动态代理的形式转换到AkkaInvocationHandler代理类中执行。

在这里插入图片描述

 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/399394.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 2023.2 配置 JavaWeb 工程

目录 1 不使用 Maven 创建 JavaWeb 工程 1.1 新建一个工程 1.2 配置 Tomcat 1.3 配置模块 Web 2 使用 Maven 配置 JavaWeb 工程 2.1 新建一个 Maven 工程 2.2 配置 Tomcat &#x1f4a5;提示&#xff1a;IDEA 只有专业版才能配置 JavaWeb 工程&#xff0c;若是社区版&am…

VIO第3讲:基于优化的IMU与视觉信息融合之最小二乘详解

第3讲&#xff1a;基于优化的IMU与视觉信息融合之最小二乘详解 文章目录 第3讲&#xff1a;基于优化的IMU与视觉信息融合之最小二乘详解1 最小二乘问题求解1.1 基础概念1.2 总结1.1 基础&#xff1a;最速下降法&#xff0c;牛顿法, 阻尼法1.1.1 迭代法1.1.2 最速下降法&#xf…

OAuth2.0 最简向导

本文是一篇关于OAuth2.0的启蒙教程&#xff0c;图文并茂&#xff0c;通俗易懂&#xff0c;力求用最简洁明了的方式向初学者解释OAuth2.0是什么。本文并不是冗杂难懂的长篇大论&#xff0c;一图胜千言&#xff0c;深入浅出OAuth2.0&#xff0c;知其然知其所以然。 参考文献 首…

DDI中的自适应子结构

SA-DDI提出了一种子结构感知图神经网络&#xff0c;一种配备了子结构注意力机制和用于DDI预测的子结构-子结构交互模块&#xff08;SSIM&#xff09;的消息传递神经网络。具体而言&#xff0c;基于分子中官能团的尺寸和形状通常是不规则的化学直觉&#xff0c;子结构注意力被设…

大模型时代下做科研的四个思路【论文精读·52】

大家好&#xff0c;上个礼拜FacebookMetaAI刚刚开源了他们自己的一个语言的大模型&#xff0c;叫做LLAMA&#xff0c;这个LLAMA的模型有65billing的参数&#xff0c;效果自然是不错的。他们的目的也是想让这个大模型更加的亲民&#xff0c;能够让更多人拿到这个模型的参数&…

ClickHouse快速上手

简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS) 官网(https://clickhouse.com/docs/zh)给出的定义&#xff0c;其实没看懂 特性 ClickHouse支持一种基于SQL的声明式查询语言&#xff0c;它在许多情况下与ANSI SQL标准相同。使用时和MySQL有点相似&#…

加固平板电脑在无人机的应用|亿道三防onerugged

无人机技术的快速发展已经在许多领域展现出巨大潜力&#xff0c;而加固平板电脑的应用在无人机领域中扮演着重要角色。 首先&#xff0c;加固平板电脑在无人机探测设备中发挥着关键作用。无人机探测设备通常需要实时传输高清图像和数据&#xff0c;以支持各种监测、勘测和检测…

JAVA高并发——无锁与死锁

文章目录 1、与众不同的并发策略&#xff1a;比较交换2、无锁的线程安全整数&#xff1a;AtomicInteger3、Java中的指针&#xff1a;Unsafe类4、无锁的对象引用&#xff1a;AtomicReference5、带有时间戳的对象引用&#xff1a;AtomicStampedReference6、数组也能无锁&#xff…

Unity2023.1.19_ShaderGraph节点说明以及使用技巧

Unity2023.1.19_ShaderGraph节点说明以及使用技巧 目录 Unity2023.1.19_ShaderGraph节点说明以及使用技巧 1. 快捷键CtrlG完成和UE蓝图使用快捷键C一样的蓝图分组注释效果&#xff1a; 2. Tiling And Offset&#xff1a; 3. 以下是两组URP材质渲染的效果对比&#xff1a; 4…

JWT 重点讲解

JWT 重点讲解 文章目录 JWT 重点讲解1. JWT 是什么2. JWT 的组成2.1 第一部分 HEADER2.2 第二部分 PAYLOAD2.3 第三部分 SIGNATURE 3. JWT 在线生成与解析4. JWT 的特点4.1 无状态4.2 可自定义4.3 扩展性强4.4 调试性好4.5 安全性取决于密钥管理4.6 无法撤销4.7 需要缓存到客户…

Android基础Adapter适配器详解

一、概念 Adapter是后端数据和前端显示UI的适配器接口。常见的View如ListView、GridView等需要用到Adapter. BaseAdapter&#xff1a;抽象类&#xff0c;实际开发中继承这个类并且重写相关方法&#xff0c;用得最多的一个Adapter&#xff01; ArrayAdapter&#xff1a;支持泛型…

第五篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:详细解读pyttsx3的`preprocess_text`函数文本预处理。

传奇开心果短博文系列 系列短博文目录Python文本和语音相互转换库技术点案例示例系列 短博文目录前言一、pyttsx3的preprocess_text函数文本预处理基本用法示例代码二、实现更复杂的文本预处理逻辑示例代码三、去除停用词、词干提取示例代码四、词形还原、拼写纠正示例代码五、…

19-k8s的附加组件-coreDNS组件

一、概念 coreDNS组件&#xff1a;就是将svc资源的名称解析成ClusterIP&#xff1b; kubeadm部署的k8s集群自带coreDNS组件&#xff0c;二进制部署需要自己手动部署&#xff1b; [rootk8s231 ~]# kubectl get pods -o wide -A k8s系统中安装了coreDNS组件后&#xff0c;会有一个…

Linux(五)__系统管理

介绍 通常&#xff0c; Windows 中使用"任务管理器"主要有 3 个目的&#xff1a; 利用"应用程序"和"进程"标签来査看系统中到底运行了哪些程序和进程&#xff1b;利用"性能"和"用户"标签来判断服务器的健康状态&#xff1…

国际章真厉害,离婚后仍带汪峰继女小苹果赴日滑雪。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 在如今这个纷繁复杂的社会中&#xff0c;家庭关系和亲子关系的…

K8S | 全面解读CKA认证的重要性!

K8S认证工程师&#xff08;CKA&#xff09;备考与学习指南https://blog.csdn.net/XMWS_IT/article/details/133697915?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170849020616800182129977%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2…

在VS里使用C#制作窗口应用

新建项目 创建项目的时候搜索net&#xff0c;选择这个。 打开应该是这样 第一个控件 选择公共控件 - PictureBox - 拖入Form 在Image处选择上传本地资源&#xff0c;建议上传一个小一点的图片。 修改一下尺寸。 ctrls 保存 从“属性”切换到“事件” 双击Click事件…

学习并理解SQL注入问题

一、什么是sql注入 public class TestSql {public static void main(String[] args) {Scanner inScanner new Scanner(System.in);System.out.println("请输入用户名");String username inScanner.nextLine();System.out.println("请输入密码");String …

【RN】为项目使用React Navigation中的navigator

简言 移动应用基本不会只由一个页面组成。管理多个页面的呈现、跳转的组件就是我们通常所说的导航器&#xff08;navigator&#xff09;。 React Navigation 提供了简单易用的跨平台导航方案&#xff0c;在 iOS 和 Android 上都可以进行翻页式、tab 选项卡式和抽屉式的导航布局…

防御第六次作业-防火墙综合实验(av、url过滤、dns过滤)

目录 拓扑图&#xff1a; 要求&#xff1a; 8 9 10 11 拓扑图 要求 前7个要求在上一篇博客&#xff1b; 8.分公司内部的客户端可以通过域名访问到内部的服务器 9.假设内网用户需要通过外网的web服务器和pop3邮件服务器下载文件和邮件&#xff0c;内网的FTP服务器也需要…