RPC
目录
警告
本文最后更新于 2020-08-10,文中内容可能已过时。
一、RPC 机制
RPC是远程过程调用协议(Remote Procedure Call)。
- RPC是指client上的进程,调用server上的进程,其中client上的调用被挂起,而server上的被调用进程开始执行,并将结果返回给client。
- client接收到返回之后,调用进程继续执行。
- 调用方可以通过参数等方式将信息传送给被调用方,而后可以通过传回来的结果得到信息。
- 而这过程,对于开发人员来说的透明的,开发者并不知晓也无需知道双方是如何传递信息或结果的。
广义:可以将目前所有客户端和服务端交互的方式都纳入RPC的范畴,比如HTTP请求交互、通过SOAP简单对象访问协议进行交互,消息队列请求等等。 狭义:RPC是指基于底层协议二进制流,并提供类似于本地方法调用形式的客户端服务器交互方式。
图片引用自 Remote Procedure Call (RPC) Protocol in Operating System
- client进程以正常的方式调用clinet stub
- client stub生成一个消息,然后调用本地操系统的网络通信模块,stub进入阻塞状态
- client操作系统将消息交给server操作系统
- server操作系统将网络消息交给server stub a. server stub将参数提取出来,调用server端程序 b. server执行相应的操作,操作完成后将结果返回给server操作系统
- server将含有结果的消息发送给client操作系统
- client操作系统将消息交给clinet stub后,stub从阻塞状态,进入运行状态。 a. client stub 将结果从消息中提取出来,返回给调用它的客户端过程
RPC的优点
- 可以直接使用本地过程调用语义来调用远程函数并获取响应,而且可以随时修改stub的具体实现,在真正本地访问和远程访问之间随意切换,而不需要对业务代码进行修改。
- 简化了编写分布式应用的难度,因为RPC隐藏了所有的网络代码存根函数的细节,应用程序不关心一些具体的细节实现,比如Socket、端口号以及数据的转换和解析等。
二、实现RPC的主要问题
2.1 参数传递
2.1.1 传递值参数
客户端和服务端都要知晓消息体的格式才可以使用参数传递。
2.1.2 传递引用参数
- 单传引用没有任何意义
- 将引用和值副本一起传递,复杂。 所以,RPC一般不支持直接传递引用。
2.1.3 数据格式的统一问题
不同机器上字节顺序不同,不同大小整数,以及不同的浮点表示。
常见的数据传输格式
- ISO标准ASN.1(Abstract Syntax Notation)
- JSON(JavaScript Object Notation)
- Google Protocol Buffer
- XML
2.2 通信协议制定
公有协议:HTTP、SMPP、WebService
私有协议:没有被国际标准组织接纳和认可的协议,Thrift、蚂蚁金服的bolt
私有的优缺点
优点
- 高度定制化的协议最大程度地提升性能,降低成本,提高灵活性与效率。
- 灵活满足各种通信功能需求:CRC校验,Server Fail-Fast机制和自定义序列化器。
缺点
- 通用性、公网传输的能力
私有通信协议设计
2.2.1 协议设计
协议设计需要考虑的问题
- 协议包括必要字段与主要业务负载字段 a. 避免无效字段
- 通信功能特性支持 a. CRC校验 b. 安全校验 c. 数据压缩机制
- 协议升级机制
2.2.2 私有协议的编解码
对业务负载支持不同的编解码机制。
2.2.3 命令定义和命令处理
2.2.4 命令协议
序列化协议也是通信协议的一部分。比如HTTP可以承载的序列化方式XML,JSON,ProtoBuf,Thrift,Avro。
2.2.5 通信模式
模式 | 介绍 |
---|---|
Oneway | 不关系响应,请求线程不会被阻塞,但使用时需要注意控制调用流量,进行蓄洪,防止压垮下游业务服务 |
Sync | 调用会阻塞请求线程,待响应返回后才能进行下一个请求。这是最常用的一种通信模型 |
Future | 调用,在调用过程不会阻塞线程,但获取结果的过程会阻塞线程 |
Callback | 真正的异步调用,不会阻塞线程,结果处理是在异步线程里执行 |
2.3 错误和超时处理
远程过程调用可能出现的情况
- 如果服务崩溃或服务端程序报错,那么远程过程调用会被执行0次;如果正常会被执行1次。
- 如果服务端程序在返回网络响应前报错,最终远程过程可能会被执行1次或多次。客户端接收不到返回的响应,如果有重试机制,进行重试,最终过程会执行多次。如果没有重试机制,则过程只会被执行1次。
- 如果客户端请求超时并重新发起调用,那么远程过程会被执行多次。
三、通用RPC接口
功能 | 介绍 |
---|---|
名称服务操作 | 注册和查找绑定信息(端口、机器)。允许一个应用程序使用动态端口(操作系统分配的) |
绑定操作 | 使用适当的协议建立客户机/服务器通信(建立通信端点) |
终端操作 | 注册端点信息(协议、端口、机器名)到名称服务并监听过程调用请求。这些函数通常被自动生成的主程序–服务器存根(骨架)所调用 |
安全操作 | 系统应该提供机制保证客户端和服务器之间能够相互验证,两者之间提供一个安全的通信通道 |
国际化操作 | 很少的一部分RPC包可能包括了转换时间格式、货币格式和特定于语言的在字符串表的字符串的功能 |
封装处理/数据转换操作 | 函数将数据序列化为一个普通的字节数组,通过网络进行传递,并能够重建 |
存根内存管理和垃圾收集 | 存根可能需要分配内存来存储参数,特别是模拟引用传递语义。RPC包需要分配和清理任何这样的分配。他们也可能需要为创建网络缓冲区而分配内存。RPC包支持对象,RPC系统需要一种跟踪远程客户端是否仍有引用对象或一个对象是否可以删除 |
程序标识操作 | 允许引用程序访问(或处理)RPC接口集的标识符,这样的服务器提供的接口集可以被用来交流和使用 |
《Implementing remote procedure calls》 蚂蚁通信框架实践 SOFABolt 功能介绍