1、RpcEndpoint: RPC端點
Spark針對每個節點(Client、Master、Worker)都稱之為一個RpcEndpoint,且都實現RpcEndpoint接口,內部根據不同端點的需求,設計不同的消息和不同的業務處理,如果需要發送(詢問)則內部調用Dispatcher的對應方法
說明:
- RpcEndpoint 用來接收消息
- RpcEndpointRef 用來發送消息
RpcEndpointRef的具體實現類是: NettyRpcEndpointRef
2、RpcEnv:Rpc上下文(Rpc環境)
每個RpcEndpoint運行時依賴的上下文環境稱為 RpcEnv
3、Dispatcher:消息分發器
PC 端點需要發送消息或者從遠程 RPC 端點接收到的消息,分發至對應的指令收件箱/發件箱
- 如果指令接收方是自己則存入收件箱
- 如果指令接收方不是自己則放入發件箱
1 // class NettyRpcEnv 2 private[netty] def send(message: RequestMessage): Unit = { 3 // 獲取接收者地址信息 4 val remoteAddr = message.receiver.address 5 if (remoteAddr == address) { 6 // Message to a local RPC endpoint. 7 // 把消息發送到本地的 RPC 端點 (發送到收件箱) 8 try { 9 dispatcher.postOneWayMessage(message) 10 } catch { 11 case e: RpcEnvStoppedException => logWarning(e.getMessage) 12 } 13 } else { 14 // Message to a remote RPC endpoint. 15 // 把消息發送到遠程的 RPC 端點. (發送到發件箱) 16 postToOutbox(message.receiver, OneWayOutboxMessage(serialize(message))) 17 } 18 }
4、Inbox:指令消息收件箱
一個本地 RpcEndpoint 對應一個收件箱
5、RpcEndpointRef:RpcEndpointRef 是對遠程 RpcEndpoint 的一個引用
當我們需要向一個具體的 RpcEndpoint 發送消息時,一般我們需要獲取到該RpcEndpoint 的引用,然后通過該引用發送消息
6、OutBox:指令消息發件箱
對於當前 RpcEndpoint 來說,一個目標 RpcEndpoint 對應一個當前的發件箱,如果向多個目標 RpcEndpoint 發送信息,則有當前會有多個 OutBox。
當消息放入 Outbox 后,緊接着通過 TransportClient 將消息發送出去。
消息放入發件箱以及發送過程是在同一個線程中進行
7、RpcAddress:表示遠程的RpcEndpointRef的地址,Host + Port。
8、TransportClient:Netty通信客戶端
一個 OutBox 對應一個 TransportClient,TransportClient 不斷輪詢OutBox,根據 OutBox 消息的 receiver 信息,請求對應的遠程 TransportServer