这是我参与「第五届青训营 」笔记创作活动的第8天
RPC框架
基本概念
远程函数调用——Remote Procedure Calls
主要内容:
- 函数映射
- 数据转换为字节流
- 网络传输
模型:
- User(call&return)
- User-Stub(pack&unpack)
- RPC-Runtime(transmit&receive)
- Server-Stub(unpack&pack)
- Server(work)
概念:
- IDL:通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信
- 生成代码:通过编译器工具把IDL文件转换成语言对应的静态库
- 通信协议:规范了数据在网络中的传输内客和格式。除必须的请求/响应数据外,通常还会包含额外的元数据
- 网络传输:通常基于成熟的网络库走TCP/UDP传输
RPC好处:
- 单一职责,有利于分工协作和运维开发
- 可扩展性强,资源使用率更优
- 故障隔离,服务的整体可靠性更高
RPC框架解决的问题:
- 服务宕机对方如何处理
- 网络异常,保证消息可达性
- 请求量突增应对
分层设计
编解码层
生成代码:依赖同一份IDL文件生成不同语言的CodeGen
数据格式:
- 语言特定的格式:编程语言内建的将内存对象编码为字节序列的支持,如java.io.Serializable(对编程语言依赖性强)
- 文本格式:JSON、XML、CSV等文本格式(具有人类可读性,但传输开销大)
- 二进制编码:具备跨语言和高性能等优点,如Thrift的BinaryProtocol,Protobuf等
选型
- 兼容性:支持自动增加新的字段,不影响老的服务,提高系统的灵活度
- 通用性:支持跨平台,跨语言
- 性能:空间维度——编码后数据大小,时间维度——编码耗费时长
协议层
- 特殊结束符:一个特殊字符作为每个协议单元结束的标示
- 变长协议:以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度
网络通信层
网络库
- 提供易用API:封装底层Socket API;连接管理和事件分发
- 功能:多协议支持——tcp、udp、uds等;优雅退出、异常处理等
- 性能:应用层buffer减少copy;高性能定时器、对象池等
关键指标
稳定性
保障策略:
- 熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路
- 限流:保护被调用方、防止大流量把服务压垮
- 超时控制:避免浪费资源在不可用节点上
请求成功率:
- 负载均衡
- 重试
长尾请求:99%响应时间后进行BackupRequest
注册中间件:采用中间件的方式实现以上策略
易用性
-
开箱即用:合理的默认参数选项,丰富的文档
-
周边工具:生成代码工具、脚手架工具
-
扩展性
-
观测性:log、metric、tracing;内置观测性服务
-
高性能
场景:单机多机;单机多连接;单/多 server/client;不同大小的请求包;不同的请求类型 目标:高吞吐;低延迟 手段:连接池;多路复用;高性能解码协议;高性能网络库