flink解析:基于Akka的Rpc

前置知识:

前置知识1:Actor的创建

Props代表的是一个不可变的配置类,创建Actor时,必须要用到;它由两部分构成

  1. 创建的Actor类:akkaRpcActorType,它是Class类型
  2. 调用上述Class的构造方法使用的参数:剩余的参数

比如,如下代码用来创建持有通信实体TaskExecutor引用的Actor

Props.create(AkkaRpcActor.class,
                    TaskExecutor实例,
                    actorTerminationFuture,
                    getVersion(),
                    configuration.getMaximumFramesize())

看看AkkaRpcActor的构造方法,剩余参数与构造方法入参一一对应上了

AkkaRpcActor(
            final T rpcEndpoint,
            final CompletableFuture<Boolean> terminationFuture,
            final int version,
            final long maximumFramesize) 

每个Actor在创建时都会返回一个ActorRef,用来与Actor通信。

前置知识2:flink使用的Actor
  • flink中所有的通信实体,都需要继承RpcEndpoint抽象类;flink中常见的组件,如JobMaster、Dispatcher、ResourceManager、TaskExecutor等都直接或间接继承自RpcEndpoint。在flink使用的Actor有如下几种:
  1. SupervisorActor:用来创建AkkaRpcActor、FencedAkkaRpcActor,它们用来接收对应的ActorRef发送的消息
  2. AkkaRpcActor:RpcEndpoint使用的actor
  3. FencedAkkaRpcActor: FencedRpcEndpoint使用的actor,相较于RpcEndpoint增加了防护令牌,FencedAkkaRpcActor继承自 AkkaRpcActor
前置知识3:动态代理

动态代理

RPC过程

  • 那么RpcEndpoint与Actor的关系是怎样的?


    akka-rpc-整体图

如上图,每个Actor都持有RpcEndpoint的引用,当Actor接收到具体RPC消息后,会调用底层的RpcEndpoint实现类来干活。整个RPC流程如下:

  1. 构建代理$Proxy,它是发送消息的入口,这个过程等会再描述
  2. 用户调用$Proxy的方法干活,实际会调用AkkaInvocationHandler的invoke方法,handler就能获取到对应的方法签名与传参,将<方法签名,传参>封装为消息,通过ActorRef发送给AkkaActor
  3. 利用反射获取底层的RpcEndpoint实现类的Class对象,通过<方法签名,传参Class对象>就可以获取具体的实现,然后执行即可
  4. 如果需要返回,则返回结果给ActorRef
  • 那Actor会处理什么信息?每个Actor都会重写AbstractActor的createReceive方法,当该actor接收到信息时,会根据消息的类型调用相应的方法来进行处理,比如SupervisorActor的实现:
@Override
    public Receive createReceive() {
        return receiveBuilder()
// 偏函数,当消息的类型是StartAkkaRpcActor,则使用createStartAkkaRpcActorMessage方法来处理
            .match(StartAkkaRpcActor.class, this::createStartAkkaRpcActorMessage)
// 否则,对于其它的任意类型,都使用handleUnknownMessage方法来处理
            .matchAny(this::handleUnknownMessage)
            .build();
    }
问题1:对于本地的RPC,$Proxy怎么构建?

最典型的场景莫过于JobMaster的SlotPoolImpl向ResourceManager请求资源了。整个过程如下

  1. 在JobMaster创建时,会传入ResourceManager的actor地址targetAddress
  2. 当JobMaster请求资源时,AkkaRpcService会通过targetAddress创建连接ResourceManager的ActorRef
  3. 然后通过该ActorRef就可以构建FencedAkkaInvocationHandler,然后构建代理,由于代理也实现了ResourceManagerGateway,该代理就被强转为大家看到的ResourceManagerGateway。当在看代码的时候,发现以GateWay结尾(通常都实现了FencedRpcGateway或RpcGateway接口)的基本都是上图中的$Proxy,它们是发送消息给Actor的入口
  4. SlotPoolImpl就可以通过ResourceManagerGateway与ResourceManager通信了
问题2:对于远程的RPC,$Proxy怎么构建?

最典型的场景莫过于TaskExecutor(即文档中说的TaskManager,用来提供slot与执行任务的,它也是RpcEndpoint)启动时调用自己的onStart方法向ResourceManager注册。TaskExecutor持有了ResourceManager的地址,过程和上面一致

问题2:消息怎么返回?返回给谁?

ActorRef就是客户端,也是返回给它

// rpc,就像在本地调用一样
final CompletableFuture<?> resultFuture = ask(rpcInvocation, futureTimeout);
// rpcEndpoint就是目标通信实体的ActorRef
protected CompletableFuture<?> ask(Object message, Time timeout) {
        return FutureUtils.toJava(
            Patterns.ask(rpcEndpoint, message, timeout.toMilliseconds()));
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容