远程过程调用(远程调用)
1、什么是分布式计算
在计算机科学中,分布式计算(英语:Distributed computing),又译为分散式运算。这个研究领域,主要研究分布式系统(Distributed system)如何进行计算。分布式系统是一组电脑,透过网络相互连接传递消息与通信后并协调它们的行为而形成的系统。组件之间彼此进行交互以实现一个共同的目标。把需要进行大量计算的工程数据分割成小块,由多台计算机分别计算,再上传运算结果后,将结果统一合并得出数据结论的科学。分布式系统的例子来自有所不同的面向服务的架构,大型多人在线游戏,对等网络应用。
目前分布式计算项目通常使用世界各地上千万志愿者计算机的闲置计算能力,通过互联网进行数据传输(志愿计算)。如分析计算蛋白质的内部结构和相关药物的Folding@home项目,该项目结构庞大,需要惊人的计算量,由一台电脑计算是不可能完成的。虽然现在有了计算能力超强的超级计算机,但这些设备造价高昂,而一些科研机构的经费却又十分有限,借助分布式计算可以花费较小的成本来达到目标。
2、什么是远程过程调用
分布式计算中,远程过程调用(英语:Remote Procedure Call,RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。
如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用,例:Java RMI。
RPC是一种进程间通信的模式,程序分布在不同的地址空间里。如果在同一主机里,RPC可以通过不同的虚拟地址空间(即便使用相同的物理地址)进行通讯,而在不同的主机间,则通过不同的物理地址进行交互。许多技术(通常是不兼容)都是基于这种概念而实现的。
3、远程过程调用步骤
远程过程调用包含如下步骤:
- 客户过程以正常的方式调用客户存根;
- 客户存根生成一个消息,然后调用本地操作系统;
- 客户端操作系统将消息发送给远程操作系统;
- 远程操作系统将消息交给服务器存根;
- 服务器存根调将参数提取出来,而后调用服务器;
- 服务器执行要求的操作,操作完成后将结果返回给服务器存根;
- 服务器存根将结果打包成一个消息,而后调用本地操作系统;
- 服务器操作系统将含有结果的消息发送给客户端操作系统;
- 客户端操作系统将消息交给客户存根;
- 客户存根将结果从消息中提取出来,返回给调用它的客户存根。
以上步骤就是将客户过程对客户存根发出的本地调用转换成对服务器过程的本地调用,而客户端和服务器都不会意识到中间步骤的存在。
RPC 的主要好处是双重的。首先,程序员可以使用过程调用语义来调用远程函数并获取响应。其次,简化了编写分布式应用程序的难度,因为 RPC 隐藏了所有的网络代码存根函数。应用程序不必担心一些细节,比如 socket、端口号以及数据的转换和解析。在 OSI 参考模型,RPC 跨越了会话层和表示层。
4、如何传递参数?
1、传递值参数
传递值参数比较简单,下图是一个传递值参数的例子。其中 add(i,j),i 和 j 是参数,返回的是 i 和 j 的和
通过 RPC 进行远程计算的步骤有:
- 将参数放入消息中,并在消息中添加要调用的过程的名称或者编码。
- 消息到达服务器后,服务器存根堆该消息进行分析,以判明需要调用哪个过程,随后执行相应的调用。
- 服务器运行完毕后,服务器存根将服务器得到的结果打包成消息送回客户存根,客户存根将结果从消息中提取出来,把结果值返回给客户端。
当然,这里只是做了简单的演示,在实际分布式系统中,还需要考虑其他情况,因为不同的机器对于数字、字符和其他类型的数据项的表示方式常有差异。比如整数型,就有 Big Endian 和 Little Endian 之分。
2、传递引用参数
传递引用参数
传递引用参数相对来说比较困难。
单纯传递参数的引用(也包含指针)是完全没有意义的,因为引用地址传递给远程计算机,其指向的内存位置可能跟远程系统上完全不同。
如果你想支持传递引用参数,你必须发送参数的副本,将它们放置在远程系统内存中,向他们传递一个指向服务器函数的指针,然后将对象发送回客户端,复制它的引用。
如果远程过程调用必须支持引用复杂的结构,比如树和链表,他们需要将结构复制到一个无指针的表示里面(比如,一个扁平的树),并传输到在远程端来重建数据结构。
5、远程过程调用的优缺点
远程过程调用(RPC)是一种用于在分布式系统中进行通信的机制,它允许程序调用在不同机器上运行的远程服务。RPC有以下优点和缺点:
优点:
-
简化系统架构:RPC可以将分布式系统的各个部分连接起来,使得系统架构更加简洁和模块化。它允许开发人员将不同的模块作为独立的服务实现,并通过RPC进行通信,而不需要直接处理底层通信细节。
-
提高开发效率:RPC框架通常提供了一些工具和库,可以简化开发过程。它们提供了代码生成器、序列化和反序列化支持等功能,使得开发人员更容易构建分布式系统。
-
提供透明性:RPC使得在远程调用时,开发人员可以像调用本地函数一样调用远程函数。这种透明性让分布式系统的开发更容易理解和维护。
-
提供跨语言支持:RPC框架通常提供多种编程语言的支持,使得不同语言编写的服务可以相互调用。这使得开发人员可以使用他们最喜欢的语言来实现不同的部分,并且能够利用现有的代码库。
缺点:
-
性能开销:RPC在调用远程服务时需要进行序列化和网络传输,这会引入一定的性能开销。特别是在大规模分布式系统中,网络延迟可能成为性能瓶颈。
-
可靠性依赖于网络:RPC的可靠性取决于底层网络的稳定性。如果网络连接不稳定或发生故障,可能会导致调用失败或返回错误结果。为了提高可靠性,通常需要在RPC框架中实施重试、超时等机制。
-
版本兼容性:当服务端或客户端进行升级时,可能会导致接口的变化。这可能导致不同版本之间的兼容性问题,特别是在分布式系统中存在多个服务的情况下。必须谨慎处理版本管理,以确保不破坏系统的互操作性。
-
系统复杂性:RPC的使用会增加系统的复杂性。需要考虑各种问题,如并发访问、服务发现、容错机制等。处理这些问题可能需要额外的工作和技术栈知识。
互操作性。
- 系统复杂性:RPC的使用会增加系统的复杂性。需要考虑各种问题,如并发访问、服务发现、容错机制等。处理这些问题可能需要额外的工作和技术栈知识。
综上所述,RPC在简化系统架构、提高开发效率和提供透明性方面具有优势;然而,它也存在性能开销、可靠性依赖、版本兼容性和系统复杂性等缺点。因此,在使用RPC时需要权衡这些优缺点,并根据具体情况进行决策。