这是我参与「第五届青训营」伴学笔记创作活动的第12天。青训营的第十四次课程中对RPC的基本概念、分层设计、核心指标进行了讲解,下面是我对本次课程内容的一些总结。
RPC的基本概念
RPC即远程函数调用,是业务系统内常用的一种远端通信手段,其相较于HTTP使用更灵活、性能更高。其需要解决的问题为:
- 函数映射:在两个远程进程间,需要将调用与被调用的函数进行映射;
- 数据转化成字节流:客户端需要将函数调用信息转化为字节流,并且服务器收到字节流后需要对其进行解析;
- 网络传输:即实际的传输、接收字节流的过程。
上图展示了一次RPC通信的流程:
- GenCode:在RPC通信中,IDL文件作为了客户端与服务端的中立协调者,其声明了可以被调用的函数具体有哪些,以及其所对应的方法。并且,由工具生成具体的调用、接收代码。
- 解码编码:服务双方需要一定的通信协议,使得数据可以在双方得到共识;
- 网络传输:通常基于成熟的网络库,使用TCP/UDP进行传输。
RPC分层设计
RPC框架主要由三层构成:
- 解编码层:通过代码生成工具把IDL文件转化成对应的库文件,使得客户端、服务器间达到共识,并制定具体的解码编码协议进行数据传输;
- 协议层:制定双方交流的语义,一般通过变长协议的方式完成,其中定长的部分用于描述不定长的内容长度;
- 网络通信层:使用socket套接字编程,一般运用成熟的网络库。
关键指标
稳定性
- 熔断:保护调用方,防止调用的服务出现问题影响整个链路;
- 限流:保护被调用方,防止服务被压垮;
- 超时控制:防止资源浪费在不可用节点上。
- 负载均衡:服务的流量能够妥善的分配在不同的服务节点上;
- 重试处理:RPC调用中重试是保证调用成功的必要手段,然而在多级节点下重试具有放大故障的危险,应当使用一定行为限制重试风暴;
- 长尾请求:在发送RPC调用一定时间后仍未收到请求时,可以发送备用请求以加速调用速度。
易用性
- 支持多种主流的协议;
- 具备自定义、较好的代码生成插件;
- 支持丰富的选项,支持常用的中间件;
- 具备良好的可观测性;