Spark Netty 通信框架解析


 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM