计算机系统工程之:RPC

RPC是使得本地程序可以远程调用远程的函数的一种技术,从实现层面看可以用TCP/UDP方式进行传输,有gRPC等框架来实现,在具体细节上和HTTP有许多不一样的地方,因为他是直接请求调用远程的某个函数并获取返回值

C/S

客户端视角的RPC接口:主要封装需要调用的远程函数的标识、参数、主机,并等待返回值;需要封装:Xid(事务id)、program(程序号)、procedure(函数号,表示第几个程序的第几个函数)
RPC1
服务端视角的RPC接口:主要封装等待请求和响应请求的过程,而调用函数由rpc请求内容决定;返回包括Xid、是否接受、是否处理成功、结果
RPC2
可以通过program number找到可执行文件,或者通过端口来找到正在执行的程序并请求他调用

请求细节

客户端传送给服务端的数据应该是拷贝而不是指针,因为传指针一个是远程服务器不好读取该虚拟地址内容,第二个是可能会被修改

  • 数据兼容性:例如大小端法、浮点数、对齐方式等
  • 版本兼容性:rpc版本是否兼容
  • 数据编码方式:
    • JSON:易读,方便debug;数据量大、不好处理二进制数据(Base64)、一些数据类型在不同机器上存储方式的二义性
    • Binary:压缩、精确、容易解码;不易读
  • 一些特定编程语言给rpc设定的接口往往仅限于本语言程序之间的通信

Google和Apache都设定了rpc的标准,Protocol Buffers/Thrift

  • 给定数据类型和变量编号RPC3
  • 编码:(数据类型、数据编号、具体值、变长值的长度)!RPC4
  • 对于Thrift有更强大的压缩方式,但是可读性…
  • 兼容性分析:新版本可以针对旧版本的编码方式进行编码、旧版本可以直接跳过新版本的位置数据类型
  • 编码和解码(序列化)方法已经封装到了rpc的具体实现上