flink之间的组件通信(代码片段)

张少凯 张少凯     2023-02-23     105

关键词:

Flink内部节点之间的通信是用Akka,比如jobmanager和taskmanager之间的通信。而operator之间的数据传输是用netty。一句话总结,组件之间的传递用的akka,数据之间的网络传输用的是netty。

  flink通过akka进行的分布式通信的实现,在0.9版本使用。使用akka,所有远程过程调用现在都实现为异步消息。
  RPC框架是flink任务运行的基础,flink整个RPC框架都是基于akka实现,并对akka中的actorsystem、actor进行了封装和使用。

RPC,netty,akka三者之间的关系?

  RPC是一个统称,全称叫做Remote Procedure Call,远程方法调用。是一个广泛的概念。是akka或者netty具体的某一种实现。

akka与actor模型

akka是一个并发、容错和可伸缩应用的框架。基本所有框架都有这几个优点。
每个actor都是一个单一的线程,它不断地从其邮箱中poll(拉取)消息,并且连续不断地处理,可以改变它自身的内部状态,

actor系统

可以理解为一个工作部门,每一个actor是一个员工,整个是一个actor系统。一个actor系统包含了所有存活的actors。
多个actor系统可以在一个机器上共存。actor系统能够自动识别消息是发送给本地机器还是远程机器的actor系统。
所有actors都是通过继承的方式来组织的。每个新创建的actor为子actor,每个父actor对自己的子actor负责监督。如果子actor出现错误,父actor将会收到通知。

flink中的actors

actor是一个包含状态和行为的容器。
flink系统由三个分布式组件构成:jobclient,jobmanager,taskmanager。
jobclient从用户处得到flink job,提交给jobmanager。jobmanager策划这个job的执行,首先分配所需的资源,分配的资源主要就是taskmanager上要执行的slot。资源分配之后,jobmanager部署单独的任务到响应的task manager上,一旦收到一个任务,task manager产生一个线程用来执行这个任务。状态的改变(如开始计算或者完成计算)将被发送回jobmanager。基于这些状态的更新,jobmanager将引导这个job的执行直到完成。一旦一个job执行完成,其结果就会被发送回jobclient。

异步VS消息同步

在任何地方,flink使用异步消息和通过futures(用来获取异步的响应)来处理响应。futures有一个超时时间,以防止操作失败。这是为了防止死锁,超市时间可以通过“akka.timeout”来配置。
两个actor在通信之前,需要获取一个actorRef,通过这个引用来和另一个actor通信。这个操作的查找也有一个超时时间,防止查询超时,通过"akka.lookup.timeout"。
akka可以限制消息的大小,可通过"akka.framesize"配置来更改大小。

使用akka

akka系统的核心是actorsystem和actor,actor不能直接创建,必须先创建actorsystem才能创建actor,另外,我们只能通过actorRef跟actor进行通信。
akka有两种核心的异步通信方式:tell和task。tell:仅仅使用异步方式给某个actor发送消息,无需等待actor响应结果,并且也不会阻塞后面代码的运行。
ask:当我们需要从actor获取响应结果时,可使用ask方法,ask方法会将返回结果包装到类scala.concurrent.Future中。然后通过异步回调获取返回结果。
上面主要介绍了akka中的actorsystem、actor,以及与actor的通信,flink借此构建其底层通信系统。

RPCGateway网关

flink的RPC协议通过RPCgateway来定义,主要定义通信行为,用于远程调用RPCendpoint方法,可以理解为对方的代理。job manager---》gateway(包含了各种行为方法,控制task manager)---》task manager。

RPCEndpoint终端

RpcEndpoint是通信终端,提供RPC服务组件的生命周期管理(start、stop)。每个RPCendpoint对应了一个路径(endpoint和actorsystem共同确定),每个路径对应一个actor,它实现了RpcGateway接口。
构造的时候调用rpcService.startServer()启动RpcServer,进入可以接收请求的状态,最后将RpcServer绑定到主线程上真正执行起来。
在RpcEndpoint中还定义了一些方法如runAsync(Runnable)、callAsync(callable,time)方法来执行Rpc调用,值得注意的是在flink的设计中,对于同一个endpoint,所有的调用都运行在主线程,因此不会有并发问题,当启动Rpcendpoint进行RPC通信时,它会委托RpcServer进行处理。

RpcService和RpcServer

RpcService和RpcServer是RPCendpoint的成员变量。
RpcService是Rpc服务的接口,其作用如下:
                                    根据提供的RPCendpoint来启动和停止RpcServer(actor)
                                    根据提供的地址链接到对方的RpcServer,并返回一个Rpcgateway
                                    延迟\\立刻调度runnable、callable
在flink中的实现类为AkkaRpcService,是Akka的ActorSystem的封装,基本可以理解为ActorSystem的一个适配器。
最终使用动态代理将所有的消息转发到InvocationHandler。
RpcServer负责接收响应远端RPC消息请求,是一个自身的代理对象(终端的启动实际上是由自身网关RpcServer来启动的rpcserver.start()方法。)。有两个实现:AkkaInvocationHandler和FencedAkkaInvocationHandler。

AkkaRpcActor

AkkaRpcActor是Akka的具体实现,主要负责处理如下类型消息:
      1.本地Rpc消息,调用LocalRpcInvocation
            会指派给rpcEndpoint进行处理,如果有响应,则将结果返还给sender。
      2.runAsync消息 && callAsync消息
            这类消息带有可执行的代码,直接在actor的线程中执行。
      3.控制消息controlMessages
            用来控制actor行为,start启动,stop停止,停止后收到的消息会丢弃。

RPC交互过程

RPC通信过程分为请求和响应。
请求:在RPCservice中调用connect()方法与对端的RPCendpoint(RPCserver)建立连接,connect()方法根据返回的地址返回InvocationHandler(AkkaInvocationHandler或FencedAkkaInvocationHandler)。
响应:RPC消息通过RPCendpoint所绑定的actor的actorREF发送的,akkaRPCactor是消息的接收入口,akkaRPCactor在RPCendpoint中构造生成,负责将消息交给不同的方法进行处理。

RPC流程图

vue组件之间的通信,父子组件通信,兄弟组件通信(代码片段)

组件通讯包括:父子组件间的通信和兄弟组件间的通信。在组件化系统构建中,组件间通信必不可少的。父组件-->子组件1.属性设置父组件关键代码如下:<template><Child:child-msg="msg"></Child></template>子组件关键代... 查看详情

vue组件之间的通信(代码片段)

vue组件间的通信有父--->子、子--->父、非父子之间的通信虽然我们稍微复杂的项目都用vuex来管理了,但是还是想写一篇关于有父--->子、子--->父、非父子之间通信的文章。下面通过代码来讲述父--->子组件间的通信父级... 查看详情

通俗易懂了解vue组件之间的通信方式(代码片段)

...子是由若干个小积木组成。组件化开发最大问题就是组件之间数据能够流通,即组件之间能够通信。而组件间通信无非就分为三种情况:外层的大组件向内部的小组件通信,内部的小组件向外部的大组件通信,平级之间组件通信... 查看详情

vue的$emit与$on父子组件与兄弟组件的之间通信(代码片段)

本文主要对vue 用$emit与$on来进行组件之间的数据传输.主要的传输方式有三种:1.父组件到子组件通信2.子组件到父组件的通信3.兄弟组件之间的通信 一、父组件传值给子组件父组件给子组件传子,使用props//父组件:parent.v... 查看详情

reactnative组件通信(代码片段)

在日常开发过程中,组件之间的通信我们应该经常用到,也是我们开发过程中不可或缺的一部分。组件可以分为父子组件以及兄弟组件,下面就不同组件之间的通信进行说明。父组件通过props与子组件通信定义父组件importReact,Comp... 查看详情

vue父子组件之间的相互通信(代码片段)

...于作用域的不同,无法直接对对方的数据进行操作。它们之间的数据传递都是通过中间介质进行的,父组件给子组件传值是通过props属性,而子组件给父组件传值是通过自定义事件。 1.父组件向子组件传值1<divid="app">2<p... 查看详情

vuevue+element搭建项目,组件之间通信(代码片段)

... this.$parent.XXX或者通过vue-busvue-bus既可以实现父子组件之间的通信,也可以实现兄弟组件之间的通信vue-bus安装(c)npminstallvue-bus引入importVuefrom‘vue‘;importVueBusfrom‘vue-bus‘;Vue.use(VueBus);应用:发送:this.$bu 查看详情

vue组件之间的通信(代码片段)

1.子组件给父组件传递数据&lt;body&gt;&lt;divid="app"&gt;父组件:total&lt;br&gt;&lt;son-componentv-bind:total="total"&gt;&lt;/son-component&gt;&lt;/d 查看详情

vue2.0父子组件之间的通信(代码片段)

父组件是通过props属性给子组件通信的来看下代码:父组件:<parent><child:child-com="content"></child>//注意这里用驼峰写法哦</parent>data()returncontent:‘sichaoyun‘;子组件通过props来接受数据第一种方法props:[‘childCom‘]第... 查看详情

vue之父子组件之间的通信方式(代码片段)

(一)props与$emit<!-这部分是一个关于父子组件之间参数传递的例子--><!--父组件传递参数到子组件是props,子组件传递参数到父组件是用事件触发$emit--><!OCTYPEhtml><html><head><metacharset="UTF-8"><title></ti... 查看详情

vue入门学习—组件之间的通信(代码片段)

父组件传递数据给子组件父组件数据可以通过props属性传递给子组件父组件:<template><divid="app"v-cloak><my-component:msg=‘arr‘></my-component></div></template><script>importMyComponentfrom‘./com 查看详情

flinkflink通讯组件akka与actor模型

...nk内核源码解析课程(从入门到精通)2.介绍Flink内部节点之间的通信是用Akka,比如JobManager和TaskManager之间的通信。而operator之间的数据传输是利用Netty。Flink通过Akka进行的分布式通信的实现,在0.9版中采用。使用Akka,所有远程过... 查看详情

blazor组件之间使用eventcallback进行通信(代码片段)

翻译自WaqasAnwar2021年3月28日的文章 《CommunicationbetweenBlazorComponentsusingEventCallback》 [1]Blazor应用程序是相互交互的多个Blazor组件的集合,我们可以在其他父组件中使用子组件。在实际的应用程序中,将数据或事件信息从一... 查看详情

vue中8种组件传参方式(代码片段)

...,所以对于vue来说组件间的数据通信非常重要,那么组件之间如何进行数据通信的呢?首先我们需要知道在vue中组件之间存在什么样的关系,才更容易理解他们的通信方式,就好像过年回家,坐着一屋子的陌生人,相互之间怎么称呼... 查看详情

前端开发react中父子组件之间的通信方式(代码片段)

文章目录一.父组件传递子组件1.子组件是class组件1.子组件是function组件二.子组件传递父组件一.父组件传递子组件在react中父组件传递子组件中,主要的实现方式:父组件通过属性=值的形式来传递给子组件数据;子... 查看详情

vue3组件通信学习笔记(代码片段)

一、父子组件之间通信父子组件之间如何进行通信呢?父组件传递给子组件:通过props属性;子组件传递给父组件:通过$emit触发事件;1.1父组件传递给子组件在开发中很常见的就是父子组件之间通信,比... 查看详情

vue组件之间的通信(代码片段)

...就是组件间的数据通信(暂且不谈vuex)。通信方式根据组件之间的关系有不同之处。组件关系有下面三种:父-->子、子-->父、非父子父-->子父向子传递数据通过props**父组件代码**<template><header-box:title-txt="showTitleTxt">&... 查看详情

react:组件的通信(代码片段)

...1、父组件给子组件传值  对于父组件来说,props是他们之间的媒介 classParentextendsComponentstate=msg:‘start‘;componentDidMount()setTimeout(()=>this.setState(msg:‘end‘) 查看详情