天天看點

Hadoop源碼學習:RPC Hadoop源碼學習:RPC

hadoop rpc使用java nio編寫,達到高性能,輕量級,可控性。 主要分為四層:序列化層,函數調用層,網絡傳輸層,伺服器端處理架構

序列化層:實作writable接口

函數調用層:java反射機制和動态代理實作函數調用

網絡傳輸層:使用socket機制

伺服器端處理架構:基于reactor設計模式的事件驅動i/o模型

1.定義一個協定,實作versionedprotocol接口,

2.實作rpc協定

3.服務端開啟服務

1.根據接口,遠端調用

我們來逐行分析代碼

getproxy方法,通過動态代理,将testprotocol的調用交由rpc.invoker管理,所有對testprotocol的方法調用,都将交由rpc.invoker的invoke()方法處理。

rpc.invoker将函數調用資訊(函數名、函數參數清單等)打包成可序列化的rpc.invocation對象,由ipc.client發起連結

用connectionid辨別一個連結,同一個inetsocketaddress将共享同一個連結

連結被封住成connection,每個方法調用都被封裝成一個call,connection維護一個call的hashmap

hadoop采用master/slave結構,ipc.server采用了線程池、事件驅動和reactor設計模式來提高并發性。

ipc.server是一個虛類

1.單線程listener監聽用戶端請求,從reader線程池中取出reader線程處理請求,reader讀取用戶端的調用請求并放入callqueue隊列

2.handler從callqueue隊列中取出call,執行函數調用,傳回結果

3.如果函數調用傳回的結果過大或者網絡異常,,由單線程respondeer使用異步方式繼續發送未發送完成的結果  詳細分析代碼:

Hadoop源碼學習:RPC Hadoop源碼學習:RPC

ipc.server.listener類

ipc.server.listener.reader類

ipc.server.handler類,調用ipc.rpc.server.call()來執行遠端調用,将結果傳回給用戶端、