4.3 Hadoop RPC基本框架分析
4.3.1 RPC基本概念
RPC是一种通过网络从远程计算机上请求服务,但不需要了解底层网络技术的协议。RPC协议假定某些传输协议已经存在,如TCP或UDP等,并通过这些传输协议为通信程序之间传递访问请求或者应答信息。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发分布式应用程序更加容易[1]。
RPC通常采用客户机/服务器模型。请求程序是一个客户机,而服务提供程序则是一个服务器。一个典型的RPC框架主要包括以下几个部分。
❑通信模块:两个相互协作的通信模块实现请求-应答协议。它们在客户机和服务器之间传递请求和应答消息,一般不会对数据包进行任何处理。
请求-应答协议的实现方式有两种,分别是同步方式和异步方式。如图4-7所示,同步模式下客户端程序一直阻塞到服务器端发送的应答请求到达本地;而异步模式则不同,客户端将请求发送到服务器端后,不必等待应答返回,可以做其他事情,待服务器端处理完请求后,主动通知客户端。在高并发应用场景中,一般采用异步模式以降低访问延迟和提高带宽利用率。
❑Stub程序:客户端和服务器端均包含Stub程序,可将之看作代理程序。它使得远程函数调用表现的跟本地调用一样,对用户程序完全透明。在客户端,它表现的就像一个本地程序,但不直接执行本地调用,而是将请求信息通过网络模块发送给服务器端。此外,当服务器端发送应答后,它会解码对应结果。在服务器端,Stub程序依次进行以下处理:解码请求消息中的参数、调用相应的服务过程和编码应答结果的返回值。
❑调度程序:调度程序接收来自通信模块的请求消息,并根据其中的标识选择一个Stub程序处理。通常客户端并发请求量比较大时,会采用线程池提高处理效率。
图 4-7 同步模式与异步模式对比
❑客户程序/服务过程:请求的发出者和请求的处理者。如果是单机环境,客户程序可直接通过函数调用访问服务过程,但在分布式环境下,需要考虑网络通信,这不得不增加通信模块和Stub程序(保证函数调用的透明性)。
通常而言,一个RPC请求从发送到获取处理结果,所经历的步骤如下(见图4-8):
步骤1 客户程序以本地方式调用系统产生的Stub程序;
步骤2 该Stub程序将函数调用信息按照网络通信模块的要求封装成消息包,并交给通信模块发送到远程服务器端;
步骤3 远程服务器端接收此消息后,将此消息发送给相应的Stub程序;
步骤4 Stub程序拆封消息,形成被调过程要求的形式,并调用对应的函数;
步骤5 被调用函数按照所获参数执行,并将结果返回给Stub程序;
步骤6 Stub程序将此结果封装成消息,通过网络通信模块逐级地传送给客户程序。
图 4-8 RPC通用架构