计算机系统工程之:RPC
Weiquan HuangRPC是使得本地程序可以远程调用远程的函数的一种技术,从实现层面看可以用TCP/UDP方式进行传输,有gRPC等框架来实现,在具体细节上和HTTP有许多不一样的地方,因为他是直接请求调用远程的某个函数并获取返回值
C/S
客户端视角的RPC接口:主要封装需要调用的远程函数的标识、参数、主机,并等待返回值;需要封装:Xid(事务id)、program(程序号)、procedure(函数号,表示第几个程序的第几个函数)
服务端视角的RPC接口:主要封装等待请求和响应请求的过程,而调用函数由rpc请求内容决定;返回包括Xid、是否接受、是否处理成功、结果
可以通过program number找到可执行文件,或者通过端口来找到正在执行的程序并请求他调用
请求细节
客户端传送给服务端的数据应该是拷贝而不是指针,因为传指针一个是远程服务器不好读取该虚拟地址内容,第二个是可能会被修改
- 数据兼容性:例如大小端法、浮点数、对齐方式等
- 版本兼容性:rpc版本是否兼容
- 数据编码方式:
- JSON:易读,方便debug;数据量大、不好处理二进制数据(Base64)、一些数据类型在不同机器上存储方式的二义性
- Binary:压缩、精确、容易解码;不易读
- 一些特定编程语言给rpc设定的接口往往仅限于本语言程序之间的通信
Google和Apache都设定了rpc的标准,Protocol Buffers/Thrift
- 给定数据类型和变量编号
- 编码:(数据类型、数据编号、具体值、变长值的长度)!
- 对于Thrift有更强大的压缩方式,但是可读性…
- 兼容性分析:新版本可以针对旧版本的编码方式进行编码、旧版本可以直接跳过新版本的位置数据类型
- 编码和解码(序列化)方法已经封装到了rpc的具体实现上