分布式系统中的RPC实现机制
在本文中,我们将介绍远程过程调用 (RPC) 的概念及其工作机制。
RPC 是一种构建分布式客户端-服务器系统的有效机制。 RPC 增强了客户端/服务器计算概念的编程能力和易用性。它是一种协议,允许一个软件从网络中另一台计算机上的另一个程序寻求服务,而无需了解网络。发出请求的软件称为客户端,提供服务的程序称为服务器。
调用参数在远程过程调用期间被发送到远程进程,调用者等待远程过程的响应。下图描述了两个网络系统之间的 RPC 调用期间的活动流。
语义透明度:
- 语法透明性:这意味着远程进程和本地进程之间应该有相似性。
- 语义透明性:这意味着语义上应该有相似性,即远程过程和本地过程的含义。
RPC的工作:
在 RPC 的工作中使用了 5 个元素:
- 客户
- 客户存根
- RPC 运行时
- 服务器存根
- 服务器
- Client:客户端进程发起RPC。客户端进行标准调用,这会触发客户端存根中的相关过程。
- 客户端存根: RPC 使用存根来实现语义透明。客户端调用客户端存根。客户端存根执行以下任务:
- 客户端存根执行的第一个任务是当它接收到来自客户端的请求时,它将远程/目标过程的参数和所需规范打包(编组)在消息中。
- 客户端存根执行的第二个任务是在接收到执行后的结果值时,将这些结果解包(解组)并将它们发送给客户端。
- RPC 运行时: RPC 运行时负责通过网络在客户端和服务器之间传输消息。重传、确认、路由和加密都是它执行的任务。在客户端,它从服务器端接收消息中的结果值,然后将其进一步发送到客户端存根,而在服务器端,RPC 运行时从服务器存根收到相同的消息它转发到客户端机器。它还接受客户端机器调用请求消息并将其转发到服务器存根。
- 服务器存根:服务器存根执行以下任务:
- 服务器存根执行的第一个任务是解包(解组)从本地 RPC 运行时接收到的调用请求消息,并定期调用以调用服务器中所需的过程。
- 服务器存根执行的第二个任务是,当它接收到服务器的过程执行结果时,它会将其打包成一个消息,并要求本地 RPC 运行时将其传输到解包的客户端存根。
- 服务器:从客户端机器接收到调用请求后,服务器存根将其传递给服务器。所需过程的执行由服务器执行,最后,它将结果返回到服务器存根,以便可以使用本地 RPC 运行时将其传递给客户端机器。
RPC过程:
- 客户端、客户端存根和一个 RPC 运行时实例都在客户端计算机上运行。
- 客户端通过正常提供参数来启动客户端存根进程。客户端存根获取客户端地址空间中的存储。
- 此时,用户可以使用普通的本地程序调用来访问 RPC。 RPC 运行时负责通过网络在客户端和服务器之间传输消息。重传、确认、路由和加密都是它执行的任务。
- 在服务器端,在服务器操作完成后,将值返回到服务器存根,然后将返回值打包(也称为编组)到消息中。传输层从服务器存根接收消息。
- 生成的消息由传输层传输到客户端传输层,然后传输层将消息发送回客户端存根。
- 客户端存根将结果包中的返回参数解包(也称为解编组),此时执行过程返回给调用者。
当客户端通过调用本地过程来处理请求时,该过程将以请求格式传递参数/参数,以便可以将它们以消息的形式发送到远程服务器。然后远程服务器将执行本地过程调用(基于从客户端机器到达的请求),并在执行后最终以消息的形式向客户端返回响应。直到此时客户端被阻塞,但是一旦响应来自服务器端,它将能够从消息中找到结果。在某些情况下,RPC 也可以异步执行,其中客户端在等待响应时不会被阻塞。
可以通过两种方式传递参数。第一个是按值传递,而第二个是按引用传递。当我们将地址提供给函数时,接收地址的参数应该是指针。在按引用传递中,使用指针调用函数以传递变量的地址。传值调用是指发送变量实际值的方法。
语言设计者通常是决定使用哪种参数传递方法的人。它有时取决于所提供的数据类型。整数和其他标量类型在 C 中总是按值传递,而数组总是按引用传递。