一、
对源码分析,对于设计思路理解如下:
- RpcEndpoint:RPC端点 ,Spark针对于每个节点(Client/Master/Worker)都称之一个Rpc端点 ,且都实现RpcEndpoint接口,内部根据不同端点的需求,设计不同的消息和不同的业务处理,如果需要发送(询问)则调用Dispatcher
- RpcEnv:RPC上下文环境,每个Rpc端点运行时依赖的上下文环境称之为RpcEnv
- Dispatcher:消息分发器,针对于RPC端点需要发送消息或者从远程RPC接收到的消息,分发至对应的指令收件箱/发件箱。如果指令接收方是自己存入收件箱,如果指令接收方为非自身端点,则放入发件箱
- Inbox:指令消息收件箱,一个本地端点对应一个收件箱,Dispatcher在每次向Inbox存入消息时,都将对应EndpointData加入内部待Receiver Queue中,另外Dispatcher创建时会启动一个单独线程进行轮询Receiver Queue,进行收件箱消息消费
- OutBox:指令消息发件箱,一个远程端点对应一个发件箱,当消息放入Outbox后,紧接着将消息通过TransportClient发送出去。消息放入发件箱以及发送过程是在同一个线程中进行,这样做的主要原因是远程消息分为RpcOutboxMessage, OneWayOutboxMessage两种消息,而针对于需要应答的消息直接发送且需要得到结果进行处理
- TransportClient:Netty通信客户端,根据OutBox消息的receiver信息,请求对应远程TransportServer
- TransportServer:Netty通信服务端,一个RPC端点一个TransportServer,接受远程消息后调用Dispatcher分发消息至对应收发件箱
注意:
TransportClient与TransportServer通信虚线表示两个RpcEnv之间的通信,图示没有单独表达式
一个Outbox一个TransportClient,图示没有单独表达式
一个RpcEnv中存在两个RpcEndpoint,一个代表本身启动的RPC端点,另外一个为 RpcEndpointVerifier
二、参考类图
一个Endpoint就是一个发送和接收消息的实体,有一个inbox,用来接收消息,有一个dispatcher,用来路由消息,有一个TransportServer,用来接收远程TransportClient发送的消息。一个Endpoint根据其通信的节点的数量,有相应数量的Outbox,
一个Outbox就有一个对应的TransportClient。用于将dispatcher分发来的消息传送到远程的TransportServer上。
RPCEndPoint抽象类中,有三个方法需要注意
1、receive方法,用来定义能够接受什么消息
2、receiveAndRelay方法,用来定义能够接受什么消息并回复什么消息。
3\onStart方法,该方法在节点启动的时候自动调用。
三、高层视图
master、worker都是一个endpoint