RPC应用
自成立以来,已经发表了许多有关将RPC范式应用于不同领域以及使用RPC实现创建新系统的论文。以下是一些包含RPC的应用程序和系统。
Shared State and Persistence Layer
RPC的一个主要限制(和优势)被认为是网络中所有计算机的单独地址空间。这意味着无法在调用方和被调用方之间传递对数据对象的指针或引用。因此,Interweave是一种中间件系统,可以实现在异构硬件上运行的任意数据类型和独立于语言的进程。Interweave是专门设计的,并且与基于RPC的系统兼容,并且允许使用内存块和锁更轻松地访问不同应用程序之间的共享资源。尽管已经进行了研究以确保基于RPC的系统具有全局共享状态,但是这些系统倾向于通过使用共享存储而不是单独的地址空间来消除调用者和被调用者之间的独立性和模块化感。
GridRPC
网格计算是RPC范例中使用最广泛的应用之一。在较高的层次上,它可以看作是相互连接以形成网格的计算机的网格(或网络),以便每个系统都可以利用网络中任何其他系统的资源。在GridRPC范例中,网络中的每台计算机都可以充当呼叫者或被呼叫者,这取决于所需的资源量(Caniou等,2008)。同一台计算机也可以充当呼叫者以及被呼叫者进行不同的计算。
GridSolve是最流行的GridRPC兼容中间件的实现,Ninf比GridSolve相对更老,并且于1990年代末首次发布。这是一个简单的RPC层,还提供了双方之间的身份验证和安全通信。另一方面,GridSolve比较复杂,并使用客户端-代理-服务器模型为通信提供了中间件。
Mobile Systems and Computation Offloading
如今,移动系统已经变得非常强大。借助多核处理器和千兆字节的RAM,它们可以轻松进行相对复杂的计算。由于这种进步,它们消耗了大量的能量,因此,尽管它们的电池变大了,但其使用却迅速消耗掉。此外,移动数据(网络带宽)仍然有限且昂贵。由于这些要求,最好在可能的情况下从移动系统上卸载移动计算。RPC在此计算卸载的通讯中起着重要作用。其中一些服务使用Grid RPC技术来卸载此计算。而其他技术为此使用RMI(远程方法调用)系统。
Ibis专案(Ibis,n.d.)建立了RMI(类似于JavaRMI)和GMI(群组方法调用)模型来促进外包计算。Cuckoo(Zhou,Zhang,Ye和Du,2016年)使用此Ibis通信中间件将计算从运行在Android智能手机上的应用程序(使用Cuckoo构建)转移到远程Cuckoo服务器上。微软的MAUI项目(Cuervo等人,2010年)使用RPC通信,并允许对.NET应用程序进行分区,并“细粒度的代码卸载可最大程度地节省能源,而对程序员的负担却最小”。MAUI确定在运行时卸载到外部MAUI服务器的方法。
Async RPC, Futures and Promises
远程过程调用可以是异步的。不仅如此,这些异步RPC在Futures & Promises中也扮演着不可或缺的角色。Futures & Promises是一种编程结构,其中Futures被可以是变量/数据/返回类型/错误,而Promises被视为尚未计算得到的Futures。参考Finagle对Futures & Promises的定义,在该定义中,将Futures(Empty Future)的Promises视为请求,而将Future的 异步解析得到的Promises视为响应。此构造主要用于异步编程。
使用此类RPC模型的最著名的系统也许是Twitter的Finagle和Cap’n Proto。
RPC in Microservices Ecosystem
RPC实现已从单服务器模型迁移到多台服务器,再到动态创建的,负载平衡的微服务。RPC最初是REST,Streaming RPC,MAUI,gRPC,Cap’n Proto的单独实现,现在已经可以将所有这些实现作为用户端点的单个抽象进行集成。端点是微服务的构建块。微服务通常是具有非常简单,定义明确的目的的服务,几乎可以使用与其他微服务交互的任何语言编写,以提供一种大型整体服务的感觉。这些微服务与语言无关。一种使用C/C++编写的机票微服务可能正在使用与语言无关的异步RPC框架(例如gRPC)与以不同语言(Python,C++,Java,Node.js)编写的针对单个航空公司的许多其他微服务进行通信(Google,nd)或Thrift(Prunicki,2009)。
RPC的使用使我们能够即时创建新的微服务。微服务不仅可以在运行时创建和引导,还具有诸如负载平衡和故障恢复之类的固有功能。这种引导可能发生在同一台计算机上,添加到Docker容器中(Merkel,2014年),或者跨网络(使用DNS,NAT或其他机制的任意组合)。
RPC可以定义为将所有微服务结合在一起的“胶水”(Mueller,2015年)。这意味着RPC是在不同系统上运行的不同微服务之间的主要通信机制之一。微服务请求另一个微服务执行操作/查询。另一个微服务在收到此类请求后执行操作并返回响应。此操作的范围可能从简单的计算到调用另一个创建一系列RPC事件的微服务到动态创建新的微服务以动态地平衡微服务系统的负载。这些微服务与语言无关。一种微服务可以用C/C++编写,另一种可以用不同的语言(Python,C++,Java,Node.js)编写,并且它们都可以使用与语言无关的异步高性能RPC框架(如gRPC)相互通信。(Google,nd)或Thrift(Prunicki,2009)。
使用Futures/Promises的微服务生态系统的一个例子是Twitter上的Finagle(Eriksen,2013年)。