RPC模式
RPC一般采用客户端/服务端(C/S)模式。请求方是客户端,而服务提供方是服务端。广义上,可以将目前所有客户端和服务端交互的方式都纳入RPC的范畴,比如说通过HTTP请求交互、通过HTTP请求交互、通过SOAP简单对象访问协议进行交互。
狭义上, RPC是指基于底层协议二进制流,并提供类似于本地方法调用形式的客户端服务器交互方式。
远程过程调用
RPC让远程过程调用具有与本地调用相同的形式。传统的调用一般用read函数由链接器从库中提取出来,然后链接器再将它链接到目标程序中,虽然Read中执行了系统调用,但它本身通过将参数压入堆栈的常规方式调用的,调用方并不知道read函数的具体实现。
RPC通过类似的方式获得透明性。当read实际上是一个远程过程时,库中就放入read的接口形式,称为客户存根。该read过程与原来的从本地文件系统进行读取的read过程一致,都执行了本地操作系统调用。不同的是它不要求操作系统提供数据,而是将参数打包消息,而后将此消息发送到服务器,在发送完调用请求后,客户存根即阻塞,直到收到服务器发回的相应信息为止。
传递参数
- 值传递是可以的。
- 引用参数相对比较困难。过程及其麻烦并且容易出错
- 数据格式的统一问题。在本地系统上不存在数据不相容的问题,因为数据格式总是相同的; 而在分布式系统中则不同.
协议栈 - 通信协议的制定
RPC调用的通信协议选择是指其协议栈的设计和选择。 整个协议栈的组成包括编码器、解码器、心跳、命令协议和命令处理器。
- 避免无效的字段;需要考虑通信功能特性的支持: 比如CRC校验,安全校验,数据压缩机等; 需要考虑协议的升级机制。
- 私有协议的编解码; 需要为不同的私有协议分别设计对应的编解码过程。
- 命令定义和命令处理器; 一种是负载命令(Payload Command),另一种是控制命令(Control Command)。 负载命令比如请求参数,响应结果的命令;控制命令一般为功能管理命令,心跳命令等,它们通常完成复杂的夸节点的协调功能。
- 命令协议; 序列化协议,它也是通信协议栈的一部分,同一种协议也可以。
- 通信模式;4种模式分别为: oneway、sync、future和callback。
出错和超时处理的情况
- 如果服务端崩溃或报错,那么远程过程会被执行0次。
- 如果服务端程序在返回网络响应前报错,最终远程过程可能会被执行1次或者多次。客户端接受不到返回的响应,如果有重试机制,进行重试,最终过程会执行多次。如果没有重试机制,则过程只会被执行1次。
- 如果客户端请求超时并重新发起调用,那么远程过程会被执行多次。