您的位置:首页 > 其它

分布式文件系统KFS源码阅读与分析(三):RPC实现机制(MetaServer端)

2012-02-20 18:29 344 查看
分布式文件系统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。

5、IAcceptorOwner
(1)维护一个Acceptor,并提供CreateKfsCallbackObj()接口创建KfsCallbackObj。

6、ClientManager
(1)继承于IAcceptorOwner;
(2)含有一个Acceptor,用于接收新的连接;
(3)含有CreateKfsCallbackObj()方法,用于返回一个ClientSM KfsCallbackObj与Client的连接请求关联起来。

7、ChunkServerFactory
(1)继承于IAcceptorOwner;
(2)含有一个Acceptor,用于接收新的连接;
(3)含有CreateKfsCallbackObj()方法,用于返回一个ChunkServer KfsCallbackObj与ChunkServer的连接请求关联起来。

8、ClientSM
(1)继承于KfsCallbackObj,回调函数是HandleRequest();
(2)用于与一个Client连接建立关系,处理Client发起的请求。
9、ChunkServer
(1)继承于KfsCallbackObj,回调函数是HandleHello();
(2)用于与一个ChunkServer连接建立关系,处理ChunkServer发起的hello消息。

10、KfsCallbackObj
(1)调用SetHandler()设置回调函数,当外部事件发生时,调用HandleEvent()进行回调处理。


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



=======================================================================

作者:大圆那些事(原攀峰@淘宝)

技术点:架构设计、分布式计算和存储、实时计算、Hadoop、C、Erlang、设计模式

Email:ypf412@163.com

MSN:ypf412@hotmail.com

博客:http://www.cnblogs.com/panfeng412/

微博:http://weibo.com/moudayuan/

=======================================================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: