4 RpcEndpoint生命周期之旅

By云端上的男人—DT大数据梦工厂

接下来,笔者开始看RPCEnv中的另一个相当重要的对象实体Dispatcher,该实体的作用就是把RpcEndpointRef中发送的消息借助Dispatcher实体发送到局部RpcEndpoint实体中。这在上次博客中并没有提及,毕竟涉及的知识量有些多。那么现在我们就开始去阐释这里面细节的模型。


4 RpcEndpoint生命周期之旅_第1张图片
图1

笔者所写的博客面对的人员是有scala基础以及对进程和线程有相关概念的人员和spark会基本使用的人员,如果大家有的对scala不是很熟悉的话,请大家观看家林老师的相关的scala教程链接:http://pan.baidu.com/s/1sljSvut密码:eea6.Spark基础相关的链接链接:http://pan.baidu.com/s/1eSvKaFS密码:y95q


Dispatcher实体专门负责处理RPCEnv内部的消息路由,因为在RPCEnv中可能有多个RpcEndpoint实体的存在,笔者只画出了一个而已,而发送消息的实体是RpcEndpointRef(笔者上文提到过)。在Dispatcher实体中存储了多个EndpointData实体对象,而这个EndpointData实体对象会有保存RpcEndpointRef和RpcEndpoint实体以及一个用于接收消息的Inbox实体。但是这个Inbox实体在创建的时候就放入了一个特殊的OnStart消息。这个消息就是RpcEndpoint实体在创建之后,RpcEndpoint实体的生命周期函数onStart方法将会被Dispatcher实体线程接收到OnStart消息之后被处理执行。

这也就是笔者和一些更加细节追求的人都会遇到这个疑问,即什么时候RpcEndpoint中的OnStart方法会被调用。因为这个OnStart在整个RpcEndpoint实体的生命周期中起到了很重要的作用。

如图2所示,RpcEndpoint消息实体生命周期中会被调用onStart的方法。

4 RpcEndpoint生命周期之旅_第2张图片
图2

RpcEndpoint是一个trait特质,其继承类都会执行OnStart方法。然后NettyRpcHandler实体会把RPC消息都路由到RpcEndpoint实体中。这样在RpcEndpoint实体中的receive*之类的方法都会有机会被执行。最后当这个RpcEndpoint实体关闭时候,其onStop方法也会被执行(也是通过发送OnStop消息给RpcEndpoint实体)。这样,RpcEndpoint实体的生命周期就映入我们眼帘。我们便能够RpcEndpoint实体相关的模块以后会有更好的理解。

Inbox本身就是一个消息的邮箱。来接收那些指向RpcEndpoint引用的消息,当然这些消息有远方来的消息,也有本地发送的消息。在图1中有相当详细的消息的路由的过程。

OutBox就是一个连接有一个TransportClient实体,从名字上看OutBox就是把消息从本地的RPCEnv中发送到远程的另一个RpcEndpoint实体的过程,而且OubBox实体是借助TransportClient实体来帮助本地的发送的消息通过Netty框架来把数据传输过去。

接下来,笔者会对一些消息进行划分整理一下。

在InBox实体之中,该实体接收InboxMessage类型的消息。InboxMessage是一个trait,其派生类派生图如图所示。

从InboxMessage这个名字,读者就能够看出,这些个消息是被内部RPCEnv内部的RpcEndpoint实体来接收的。


4 RpcEndpoint生命周期之旅_第3张图片
图3

图中红色部分在scala语法中是对象,其他则是类。也就是说OnStart和OnStop只需要一份即可,因为这两个消息只是对RPCEnv内部的每个RpcEndpoint实体中的onStart方法和onStop方法做处理,而且处理一次。处理之外,还有一些关于状态连接的消息如图中的青绿色所以的那样,大部分用户的程序是需要考虑关于处理连接状态的信息。

那么剩下来就是在通信中频繁要使用的消息了,即OneWayMessage和RpcMessage消息。这两个消息也有一些区别,正如其名字所说的那样,OneWayMessage消息是被其他通信模块发送过来处理完成后并不会发送Response消息,也就是一次性的消息。而对于RpcMessage消息,你懂得,需要给那些发送过来的模块以回馈处理之后的结果,即发送Response消息。这里说的通信模块可以是自己RPCEnv中的,也可以是在远程中其他的RPCEnv中的。

既然有输入消息,相比也就是有输出消息了。Outbox实体就是那个把消息要路由出去。其消息的类型就两种。


4 RpcEndpoint生命周期之旅_第4张图片
图4

分析的思想和前面类似,OneWayOutboxMessage就是把消息发送到远程的通信模块,但是并不关心给本身发送回馈消息。一次性而已。

但是RpcOutboxMessage消息就不一样了,需要让远程通信模块给自己反馈消息。那么这里面就有一个回调方法的存在,即

RpcResponseCallback。这种类似的设计思想相比大家开发中会经常碰到吧。

可能细心的读者会发现在InBox有一些消息是发送方发送来的,但是并没有在InBox讲解中说明怎么把该消息发送回去,这个问题,其实是在TransportRequestHandler实体中完成的,详细的讲解笔者以后会给出。

你可能感兴趣的:(4 RpcEndpoint生命周期之旅)