分布式文件系统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为例,图中详细展示了相关的类及方法的调用关系):