这是我参与「第五届青训营」伴学笔记创作活动的第 3 天,本文主要介绍了RPC(远程函数调用)的原理和实践。
RPC需要解决的问题
- 函数映射
- 数据转换成字节流
- 网络传输
RPC概念模型
RPC的过程由5个模型组成:User、User-Stub、RPC-Runtime、Server-Stub、Server
一次RPC的完整模型
- IDL文件:IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信。
- 生成代码:通过编译器工具把IDL文件转换成语言对应的静态库。
- 编解码:从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化。
- 通信协议:规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据。
- 网络传输:通常基于成熟的网络库走TCP/UDP传输。
RPC的好处
- 单一职责,有利于分工协作和运维开发
- 可扩展性强,资源使用率更优
- 故障隔离,服务的整体可靠性更高
RPC框架
分层设计(Apache Thrift)
解编码层
- 生成代码
- 数据格式
- 二进制编码
- 选型
协议层
- 概念
协议是双方确定的交流语义。
特殊结束符:一个特殊字符作为每个协议单元结束的标志。
变长协议:以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度。
- 协议构造
网络通信层
- Socket API
- 网络库
- 提供易用API:封装底层Socket APi、连接管理和事件分发。
- 功能:协议支持、优雅退出、异常处理等。
- 性能:应用层buffer减少copy、高性能定时器、对象池等。
关键指标
稳定性
- 保障策略:
- 熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路。
- 限流:保护被调用方,防止大流量把服务压垮。
- 超时控制:避免浪费资源在不可用节点上。
- 请求成功率
- 长尾请求:是指明显高于均值的那部分占比较小的请求。关于延迟有一个常用的P99标准,P99单个请求响应耗时从小到大排列,顺序处于99%位置的值即为P99值。那后面这1%就可以认为是长尾请求。在较复杂的系统中,长尾延时总是会存在。造成这个的原因非常多,常见的有网络抖动、GC、系统调度。
- 注册中间件
易用性
- 开箱即用:合理的默认参数选项、丰富的文档。
- 周边工具:生成代码工具、脚手架工具。
扩展性
- Middleware
- Option
- 代码生成工具插件扩展
观测性
- Log、Metric、Tracing
- 内置观测性服务
高性能
高性能意味着高吞吐和低延迟,多路复用可以大大减少了连接带来的资源消耗,并且提升了服务端性能。调用端向服务端的一个节点发送请求,并发场景下,如果是非连接多路复用,每个请求都会持有一个连接,直到请求结束连接才会被关闭或者放入连接池复用,并发量与连接数是对等的关系。