RPC原理 | 青训营笔记

54 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第13天。

RPC原理与实践

RPC的基本概念

RPC(Remote Procedure Calls) RPC需要解决的问题: 1、 函数映射 2、 数据转换为字节流 3、 网络传输 RPC过程由5个模型组成,分别为:User、User-Stub、RPC-Runtime、Server-Stub、Server

一次完整的RPC过程

IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信。 通过编译器工具把IDL文件转换成语言对应的静态库。 从内存中表示到字节序列的转换称为编码,反之称为解码,也常叫做序列化和反序列化。 规范了数据在网络中的传输的内容和格式。除必须的请求/响应数据之外,通常还会包括额外的元数据。 网络传输通常基于成熟的网络库走TCP/UDP传输。

RPC的好处

1、 单一职责,有利于分工协作和运维开发。 2、 可扩展性强,资源使用率更优。 3、 故障隔离,服务的整体可靠性更高。

RPC带来的问题

1、 服务宕机 2、 在调用过程中发生网络异常 3、 请求量突增导致服务无法及时处理

RPC分层设计

RPC分层主要分为三层:编解码层、协议层与网络通信层

编解码层

通过代码生成工具把IDL文件转换为不同语言对应的lib代码,这里面封装了编解码逻辑。

编解码层的数据格式,许多编程语言都内建了将内存对象编码为字节序列的支持,如Java中的java.io.Serializable。文本格式有JSON、XML、CSV等文本格式。二进制编码具有跨语言和高性能的特点。

TLV编码 Tag:标签,可以理解为类型。 Length:长度 Value:值,Value也可以是一个TLV结构。

编解码层的选型:要求有兼容性、通用性以及保证空间与时间维度上的性能。

协议层

概念: 分为两种: 特殊结束符:一个特殊字符作为每个协议单元结束的标识 变长协议:以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度

协议构造: LENGTH:数据包大小,不包含自身长度。 HEADER MAGIC:标识版本信息,协议解析时候快速校验。 SEQUENCE NUMBER:标识数据包的seqID,可以用于多路复用,单连接内递增。 HEADER SIZE:头部长度,从第14个字节开始计算到PAYLOAD前。 PROTOCOL ID:编解码方式,有Binary和Compact两种。 TRANSFORM ID:压缩方式,如zlib和snappy。 INFO ID:传递一些定制的Meta信息。 PAYLOAD:信息体。

网络通信层

网络库:提供易用的API、功能协议支持tcp、udp和uds等、性能上利用应用层buffer减少copy,使用高性能定时器以及对象池等。

RPC关键指标

RPC的关键指标有如下几个标准: 稳定性、易用性、扩展性、观测性、高性能。

稳定性

熔断:保护调用方,防止被调用的服务出现问题从而影响整个链路。 限流:保护被调用方,防止大流量把服务压垮。 超时控制:避免浪费资源在不可用节点之上。

易用性

要保证可以开箱即用 同时要有周边工具

观测性

除了传统的Log、Metric、Tracing三件套之外,对框架可能并不够,还有些框架自身的状态需要暴露出来,如当前的环境变量、配置、初始化参数以及缓存信息等。

高性能

要保证高吞吐和低延迟。 手段:连接池、多路复用、高性能编解码协议、高性能网络库。