分布式文件系統KFS源碼閱讀與分析(三):RPC實現機制(MetaServer端)
分布式文件系統KFS的MetaServer和Client采用服務器/客戶端模型,MetaServer和Client之間的通訊是通過RPC機制來實現的。這里介紹下KFS中MetaServer端的RPC實現機制。
1. RPC相關類
下圖所示為MetaServer端的RPC相關實現類:
1、NetDispatch
(1)啟動MetaServer端的epoll主循環;
(2)通過調用gNetDispatch.Start(gClientPort, gChunkServerPort),在指定的端口監聽來自Client和ChunkServer的RPC請求:
- 啟動ClientManager的接收者acceptor;
- 啟動ChunkServerFactory的接收者acceptor。
2、NetManager
(1)通過epoll機制,維護一組NetConnection對象;當NetConnection狀態發生變化時,調用其中的KfsCallbackObj的回調函數;
(2)同時實現了一個定時器機制。
3、NetConnection
(1)將KfsCallbackObj和TcpSocket關聯起來,代表來自客戶端的一個連接;
(2)當TCP連接的狀態發生變化時,KfsCallbackObj的回調函數將會被調用執行。
4、Acceptor
(1)從Client/ChunkServer接收新的連接,然后創建一個新的NetConnection與這個新連接關聯起來。NetConnection中含有相關的ClientSM/ChunkServer KfsCallbackObj,而ClientSM/ChunkServer KfsCallbackObj通過IAcceptorOwner的CreateKfsCallbackObj()方法被創建;
(2)繼承于KfsCallbackObj,回調函數是Acceptor::RecvConnection:
- 一個Acceptor含有一個相關的NetConnection;
- 一個Acceptor含有一個成員變量mAcceptorOwner指向ClientManager或ChunkServerFactory。
2. 請求處理過程
下圖所示為MetaServer端的RPC請求處理過程的時序圖:
KFS啟動時,將RPC的各種請求操作映射到不同的處理函數上:kfs_startup (startup.cc) > initialize_request_handlers (request.cc) > setup_handlers (request.cc)。
更進一步來分析一下,以KfsClient與MetaServer之間的RPC為例,KfsClient與MetaServer建立RPC連接后,ClientSM作為KfsClient與MetaServer之間RPC請求的代理,ClientSM負責接收并轉發來自KfsClient的各種不同Request信息,處理后負責向KfsClient寫Response信息,RPC請求的處理過程如下圖所示(以MetaLookup為例,圖中詳細展示了相關的類及方法的調用關系):

浙公網安備 33010602011771號