【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 模型的一些关键概念:
- Actor:Actor 是计算模型的基本执行单元。每个 Actor 都有自己的状态、行为和邮箱(用于接收消息)。Actor 之间是相互独立的,它们通过消息传递进行通信。
- 消息传递:在 Actor 模型中,通信是通过消息传递来实现的。一个 Actor 可以向另一个 Actor 发送消息,消息包含了要执行的操作或者改变状态的请求。这种异步消息传递使得系统更具有弹性和可伸缩性。
- 地址:每个 Actor 都有一个唯一的地址,用于唯一标识该 Actor。其他 Actor 可以使用地址向目标 Actor 发送消息。
- 邮箱:每个 Actor 都有一个邮箱,
用于存储接收到的消息
。Actor 处理消息的速度可能不同,但由于消息传递是异步的,这不会阻塞发送者。- 行为: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>() {@Overridepublic void onSuccess(ActorRef actor) {System.out.println("actor:" + actor);actor.tell("hello actor", ActorRef.noSender());}
}, system.dispatcher());fu.onFailure(new OnFailure() {@Overridepublic 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架构涉及的组件以及每种组件的作用。
- 集群RPC组件的基本实现类:
RpcEndpoint提供了集群RPC组件的基本实现,所有需要实现RPC服务的组件都会继承RpcEndpoint抽象类。
RpcEndpoint中包含了endpointId,用于唯一标记当前的RPC节点。RpcEndpoint借助RpcService启动内部RpcServer,之后通过RpcServer完成本地和远程线程执行。
- 基本实现类与FencedToken对比
对于RpcEndpoint来讲,底层主要有FencedRpcEndpoint基本实现类。
实现FencedRpcEndpoint的RPC节点都会有自己的FencedToken,当进行远程RPC调用时,会对比访问者分配的FencedToken和被访问者的FencedToken,结果一致才会进行后续操作。
- RpcEndpoint的实现类有TaskExecutor组件,FencedRpcEndpoint的实现类有Dispatcher、JobMaster以及ResourceManager等组件。这些组件可以获取RpcService中ActorSystem的dispatcher服务,并直接通过
dispatcher创建Task线程实例
。- RpcService提供了创建和启动RpcServer的方法。
在启动RpcServer的过程中,通过RpcEndpoint的地址创建Akka Actor实例,并基于Actor实例构建RpcServer接口的动态代理类,向RpcServer的主线程中提交Runnable以及Callable线程等。
同时在RpcService中提供了连接远程RpcEndpoint的方法,并创建了相应RpcGateway接口的动态代理类,用于执行远程RPC请求。
- 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代理类中执行。
相关文章:

【Flink网络通讯(一)】Flink RPC框架的整体设计
文章目录 1. Akka基本概念与Actor模型2. Akka相关demo2.1. 创建Akka系统2.2. 根据path获取Actor并与之通讯 3. Flink RPC框架与Akka的关系4.运行时RPC整体架构设计5. RpcEndpoint的设计与实现 我们从整体的角度看一下Flink RPC通信框架的设计与实现,了解其底层Akka通…...

【Flink】FlinkSQL读取hive数据(批量)
一、简介: Hive在整个数仓中扮演了非常重要的一环,我们可以使用FlinkSQL实现对hive数据的读取,方便后续的操作,本次例子为Flink1.13.6版本 二、依赖jar包准备: 官网地址如下: Overview | Apache Flink 1、我们需要准备相关的jar包到Flink安装目录的lib目录下,我们需…...

list链表
1. list基本概念 功能:将数据进行链式存储 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成:链表由一系列结点组成 结点的组成:一个是存储数据…...

<网络安全>《42 网络攻防专业课<第八课 - SQL注入漏洞攻击与防范>》
1 SQL注入漏洞利用及防范 1 SQL注入的地位 2 SQL注入的危害及本质 这些危害包括但不局限于: 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。网页篡改:通过操作数据库对特定网页进行篡改。网站被挂马,传播恶意软件&#…...

微服务开发工具及环境搭建
后端 安装jdk a. 官网下载b. 安装c. 配置环境变量参考: 博客 安装IDEA a. 官网下载社区版(免费) IntelliJ IDEA Community b. 安装 下载链接 前端 安装node 及 npm 下载链接 安装vscode 下载链接 安装Hbuilderx 下载链接 虚拟机环境 …...

HTML学习笔记——08:表单<form>
HTML <form> 元素表示文档中的一个区域,此区域包含交互控件,用于向 Web 服务器提交信息。 例如:登录页面。 作用:搜集不同类型的用户输入,并向服务器传送数据。 注意:表单本身并不可见!…...

什么是跨端,常用的跨端技术
跨平台是跨操作系统,跨端是指客户端 常见的客户端有,web、android、ios 等,客户端的特点是有界面、由逻辑,所以包含逻辑跨端和渲染跨端。 常用的跨端技术方案 React Native: 由 Facebook 推出的开源框架,…...

【书生·浦语大模型实战营】第6节:OpenCompass 大模型评测(笔记版)
OpenCompass 大模型评测 1.关于评测的三个问题 为什么需要评测:模型选型、能力提升、应用场景效果测评。测什么:知识、推理、语言;长文本、智能体、多轮对话、情感、认知、价值观。怎样测:自动化客观测评、人机交互测评、基于大…...

为什么需要写Java单元测试总结
目录 前言 一、为什么写单元测试 写单测好处 1、提升效率 2、场景覆盖全 单测怎么写 1、集成测试 2、单元测试 Mock框架 1、Mockito单元测试 2、Mockito 中文文档地址 二、强制要求 1.好的单元测试必须遵守AIR原则。 2.单元测试应该是全自动执行的,并…...

Gin框架: 控制器, 中间件的分层设计案例
对控制器的分组与继承 1 )设计项目目录结构 yourGinProject/ 根目录├── go.mod go mod 文件├── go.sum go sum 文件├── main.go main 文件└── tpls html模板目录│ └── web│ │ └── index.html├── routers 路由目录│ …...

日常遇到Maven出现依赖版本/缓存问题通用思路。
Maven依赖错误联想 明明自己的工程是直接从大佬哪里拉下来的,并且自己的setting文件也是没有问题,可是自己偏偏编译有问题。这里介绍一种通用解决方案,仅供参考。 前置排查确认 我遇到原因是在JDK升级过程中遇到的: java.lang.…...

安卓11-HDMI插拔检测流程
hdmi从插入到拔出经过底层一系列检测到应用层,应用层获取hdmi插入状态后又会做出一系列相应的动作,下面梳理了从应用层到底层一步步追踪到芯片的hpd-pin的检测过程。 frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.…...

OkHttp Retrofit HttpClient之间的区别
OkHttp、Retrofit 和 HttpClient 是三个不同的 HTTP 客户端库,它们各自有不同的特点和用途。下面是它们之间的主要区别: 1. **OkHttp**: - OkHttp 是一个高性能的 HTTP 和 HTTP/2 客户端,由 Square 公司开发。 - 它…...

Paddlepaddle使用自己的VOC数据集训练目标检测(0废话简易教程)
一 安装paddlepaddle和paddledection(略) 笔者使用的是自己的数据集 二 在dataset目录下新建自己的数据集文件,如下: 其中 xml文件内容如下: 另外新建一个createList.py文件: # -- coding: UTF-8 -- imp…...

【解析】C语言两个实例
例一: 下面程序输出什么? int main() { int i 43; int n printf("%d\n",i); printf("%d\n",n); return 0; } 大家深入考虑一下为什么返回是3这背后有什么鲜为人知的秘密到底是C语言离奇的规定还是深思熟…...

阅读笔记(Multimedia Systems2020)Review on image-stitching techniques
Wang Z, Yang Z. Review on image-stitching techniques[J]. Multimedia Systems, 2020, 26: 413-430. DOI https://doi.org/10.1007/s00530-020-00651-y...

【Java程序员面试专栏 数据结构】三 高频面试算法题:栈和队列
一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,因为栈和队列这两哥们结构特性比较向对应,所以放到一篇Blog中集中练习 题目题干直接给出对应博客链接,这里只给出简单思路、代码实现、复杂度分析 题目关键字…...

Python | Conda常用命令
一、介绍 1、Anaconda工具 Anaconda是一个用于数据科学和机器学习的开源软件包管理器和环境管理器。它包含了许多流行的数据科学工具和库,如Python、Jupyter Notebook、numpy、pandas、scikit-learn等,可以帮助用户轻松地管理和安装这些工具和库。Anaco…...

Linux 驱动开发基础知识——APP 怎么读取按键值(十二)
个人名片: 🦁作者简介:学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:Vir2021GKBS 🐼本文由…...

【FastAPI】P3 请求与响应
目录 请求路径参数查询参数 响应JSON 响应文本响应返回 Pydantic 模型 在网络通讯中,请求(Request) 与 响应(Response) 扮演着至关重要的角色,它们构成了客户端与服务器间互动的根本理念。 请求࿰…...

Python学习-流程图、分支与循环(branch and loop)
十、流程图 1、流程图(Flowchart) 流程图是一种用于表示算法或代码流程的框图组合,它以不同类型的框框代表不同种类的程序步骤,每两个步骤之间以箭头连接起来。 好处: 1)代码的指导文档 2)有助…...

Python Flask Web 框架学习笔记+完整项目
Flask是一个轻量级的基于Python的web框架。 我们建议使用最新版本的 Python。Flask 支持 Python 3.8 及更高版本。 官网:欢迎使用 Flask — Flask 文档 (3.0.x) (palletsprojects.com) RESTFul API:Python Flask高级编程之REST…...

XML Map 端口进阶篇——常用关键字和格式化器详解
XML Map 端口是用于在不同XML之间建立关系映射的工具,允许通过拖拽操作实现源XML和目标 XML之间的数据字段映射,除此之外,XML Map 端口还提供了其它丰富多彩的功能,使用户能够更加灵活和高效的处理XML 数据映射任务,让…...

排序算法之——直接插入排序
直接插入排序——以升序排列为例 1.1基本思想1.2动态图示感知1.3静态图示详解1.4代码实现1.5时间复杂度1.5.1最好情况1.5.2最差情况 1.6空间复杂度1.7稳定性1.7.1一个小问题 1.1基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直…...

突出最强算法模型——回归算法 !!
文章目录 1、特征工程的重要性 2、缺失值和异常值的处理 (1)处理缺失值 (2)处理异常值 3、回归模型的诊断 (1)残差分析 (2)检查回归假设 (3)Cooks 距离 4、学…...

云数据库 Redis 性能深度评测(阿里云、华为云、腾讯云、百度智能云)
在当今的云服务市场中,阿里云、腾讯云、华为云和百度智能云都是领先的云服务提供商,他们都提供了全套的云数据库服务,其中 Redis属于RDS 之后第二被广泛应用的服务,本次测试旨在深入比较这四家云服务巨头在Redis云数据库性能方面的…...

Android---Retrofit实现网络请求:Java 版
简介 在 Android 开发中,网络请求是一个极为关键的部分。Retrofit 作为一个强大的网络请求库,能够简化开发流程,提供高效的网络请求能力。 Retrofit 是一个建立在 OkHttp 基础之上的网络请求库,能够将我们定义的 Java 接口转化为…...

使用静态CRLSP配置MPLS TE隧道
正文共:1591 字 13 图,预估阅读时间:4 分钟 静态CRLSP(Constraint-based Routed Label Switched Paths,基于约束路由的LSP)是指在报文经过的每一跳设备上(包括Ingress、Transit和Egress…...

gentoo安装笔记
最近比较闲,所以挑战一下自己,在自己的台式电脑上安装gentoo 下面记录了我亲自安装的步骤,作为以后我再次安装时参考所用。 整体步骤 一般来将一个linux发行版的安装步骤其实大体上都差不多,基本分为一下几步: 1. …...

Git如何使用 五分钟快速入门
Git如何使用 五分钟快速入门 Git是一个分布式版本控制系统,它可以帮助开发人员跟踪和管理项目的代码变更。与传统的集中式版本控制系统(如SVN)不同,Git允许开发人员在本地存储完整的代码仓库,并且可以独立地进行代码修…...