flink解析:基于Akka的Rpc

前置知識(shí):

前置知識(shí)1:Actor的創(chuàng)建

Props代表的是一個(gè)不可變的配置類(lèi)涡贱,創(chuàng)建Actor時(shí),必須要用到畜隶;它由兩部分構(gòu)成

  1. 創(chuàng)建的Actor類(lèi):akkaRpcActorType,它是Class類(lèi)型
  2. 調(diào)用上述Class的構(gòu)造方法使用的參數(shù):剩余的參數(shù)

比如,如下代碼用來(lái)創(chuàng)建持有通信實(shí)體TaskExecutor引用的Actor

Props.create(AkkaRpcActor.class,
                    TaskExecutor實(shí)例,
                    actorTerminationFuture,
                    getVersion(),
                    configuration.getMaximumFramesize())

看看AkkaRpcActor的構(gòu)造方法船万,剩余參數(shù)與構(gòu)造方法入?yún)⒁灰粚?duì)應(yīng)上了

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

每個(gè)Actor在創(chuàng)建時(shí)都會(huì)返回一個(gè)ActorRef刻撒,用來(lái)與Actor通信。

前置知識(shí)2:flink使用的Actor
  • flink中所有的通信實(shí)體耿导,都需要繼承RpcEndpoint抽象類(lèi)声怔;flink中常見(jiàn)的組件,如JobMaster舱呻、Dispatcher醋火、ResourceManager、TaskExecutor等都直接或間接繼承自RpcEndpoint箱吕。在flink使用的Actor有如下幾種:
  1. SupervisorActor:用來(lái)創(chuàng)建AkkaRpcActor胎撇、FencedAkkaRpcActor,它們用來(lái)接收對(duì)應(yīng)的ActorRef發(fā)送的消息
  2. AkkaRpcActor:RpcEndpoint使用的actor
  3. FencedAkkaRpcActor: FencedRpcEndpoint使用的actor殖氏,相較于RpcEndpoint增加了防護(hù)令牌晚树,F(xiàn)encedAkkaRpcActor繼承自 AkkaRpcActor
前置知識(shí)3:動(dòng)態(tài)代理

動(dòng)態(tài)代理

RPC過(guò)程

  • 那么RpcEndpoint與Actor的關(guān)系是怎樣的?


    akka-rpc-整體圖

如上圖雅采,每個(gè)Actor都持有RpcEndpoint的引用爵憎,當(dāng)Actor接收到具體RPC消息后,會(huì)調(diào)用底層的RpcEndpoint實(shí)現(xiàn)類(lèi)來(lái)干活婚瓜。整個(gè)RPC流程如下:

  1. 構(gòu)建代理$Proxy宝鼓,它是發(fā)送消息的入口,這個(gè)過(guò)程等會(huì)再描述
  2. 用戶調(diào)用$Proxy的方法干活巴刻,實(shí)際會(huì)調(diào)用AkkaInvocationHandler的invoke方法愚铡,handler就能獲取到對(duì)應(yīng)的方法簽名與傳參,將<方法簽名胡陪,傳參>封裝為消息沥寥,通過(guò)ActorRef發(fā)送給AkkaActor
  3. 利用反射獲取底層的RpcEndpoint實(shí)現(xiàn)類(lèi)的Class對(duì)象,通過(guò)<方法簽名柠座,傳參Class對(duì)象>就可以獲取具體的實(shí)現(xiàn)邑雅,然后執(zhí)行即可
  4. 如果需要返回,則返回結(jié)果給ActorRef
  • 那Actor會(huì)處理什么信息妈经?每個(gè)Actor都會(huì)重寫(xiě)AbstractActor的createReceive方法淮野,當(dāng)該actor接收到信息時(shí),會(huì)根據(jù)消息的類(lèi)型調(diào)用相應(yīng)的方法來(lái)進(jìn)行處理吹泡,比如SupervisorActor的實(shí)現(xiàn):
@Override
    public Receive createReceive() {
        return receiveBuilder()
// 偏函數(shù)骤星,當(dāng)消息的類(lèi)型是StartAkkaRpcActor,則使用createStartAkkaRpcActorMessage方法來(lái)處理
            .match(StartAkkaRpcActor.class, this::createStartAkkaRpcActorMessage)
// 否則爆哑,對(duì)于其它的任意類(lèi)型洞难,都使用handleUnknownMessage方法來(lái)處理
            .matchAny(this::handleUnknownMessage)
            .build();
    }
問(wèn)題1:對(duì)于本地的RPC,$Proxy怎么構(gòu)建泪漂?

最典型的場(chǎng)景莫過(guò)于JobMaster的SlotPoolImpl向ResourceManager請(qǐng)求資源了廊营。整個(gè)過(guò)程如下

  1. 在JobMaster創(chuàng)建時(shí),會(huì)傳入ResourceManager的actor地址targetAddress
  2. 當(dāng)JobMaster請(qǐng)求資源時(shí)萝勤,AkkaRpcService會(huì)通過(guò)targetAddress創(chuàng)建連接ResourceManager的ActorRef
  3. 然后通過(guò)該ActorRef就可以構(gòu)建FencedAkkaInvocationHandler露筒,然后構(gòu)建代理,由于代理也實(shí)現(xiàn)了ResourceManagerGateway敌卓,該代理就被強(qiáng)轉(zhuǎn)為大家看到的ResourceManagerGateway慎式。當(dāng)在看代碼的時(shí)候,發(fā)現(xiàn)以GateWay結(jié)尾(通常都實(shí)現(xiàn)了FencedRpcGateway或RpcGateway接口)的基本都是上圖中的$Proxy趟径,它們是發(fā)送消息給Actor的入口
  4. SlotPoolImpl就可以通過(guò)ResourceManagerGateway與ResourceManager通信了
問(wèn)題2:對(duì)于遠(yuǎn)程的RPC瘪吏,$Proxy怎么構(gòu)建?

最典型的場(chǎng)景莫過(guò)于TaskExecutor(即文檔中說(shuō)的TaskManager蜗巧,用來(lái)提供slot與執(zhí)行任務(wù)的掌眠,它也是RpcEndpoint)啟動(dòng)時(shí)調(diào)用自己的onStart方法向ResourceManager注冊(cè)。TaskExecutor持有了ResourceManager的地址幕屹,過(guò)程和上面一致

問(wèn)題2:消息怎么返回蓝丙?返回給誰(shuí)?

ActorRef就是客戶端望拖,也是返回給它

// rpc渺尘,就像在本地調(diào)用一樣
final CompletableFuture<?> resultFuture = ask(rpcInvocation, futureTimeout);
// rpcEndpoint就是目標(biāo)通信實(shí)體的ActorRef
protected CompletableFuture<?> ask(Object message, Time timeout) {
        return FutureUtils.toJava(
            Patterns.ask(rpcEndpoint, message, timeout.toMilliseconds()));
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市说敏,隨后出現(xiàn)的幾起案子鸥跟,更是在濱河造成了極大的恐慌,老刑警劉巖盔沫,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件医咨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡架诞,警方通過(guò)查閱死者的電腦和手機(jī)腋逆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)侈贷,“玉大人惩歉,你說(shuō)我怎么就攤上這事∏温” “怎么了撑蚌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)搏屑。 經(jīng)常有香客問(wèn)我争涌,道長(zhǎng),這世上最難降的妖魔是什么辣恋? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任亮垫,我火速辦了婚禮模软,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饮潦。我一直安慰自己燃异,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布继蜡。 她就那樣靜靜地躺著回俐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稀并。 梳的紋絲不亂的頭發(fā)上仅颇,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音碘举,去河邊找鬼忘瓦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛引颈,可吹牛的內(nèi)容都是我干的政冻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼线欲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼明场!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起李丰,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤苦锨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后趴泌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體舟舒,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嗜憔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秃励。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吉捶,死狀恐怖夺鲜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呐舔,我是刑警寧澤币励,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站珊拼,受9級(jí)特大地震影響食呻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一仅胞、第九天 我趴在偏房一處隱蔽的房頂上張望每辟。 院中可真熱鬧,春花似錦干旧、人聲如沸渠欺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)峻堰。三九已至讹开,卻和暖如春盅视,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旦万。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工闹击, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人成艘。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓赏半,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親淆两。 傳聞我的和親對(duì)象是個(gè)殘疾皇子断箫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容