RPC框架分层设计
基本概念
远程函数调用需要解决的问题
1、函数映射
2、数据转换成字节流
3、网络传输
完整RPC过程
约定规范:IDL文件(接口描述语言)
生成代码:
编解码:
通信协议:
网络传输:
RPC的优势
- 单一职责
- 可扩展性强
- 故障隔离
RPC问题
- 宕机
- 网络异常无法保证可达性
- 请求激增
分层设计
编解码层|协议层|网络通信层
IDL文件转换为了不同欲来的lib代码
编解码层-生成代码 客户端与服务端依赖同一份IDL文件
数据格式(IDL文件)
- 语言特定的格式:缺乏兼容性
- 文本格式:可读但不精确 JSON,CSV等
- 二进制格式:跨语言和高性能 TVL等
编码层选型
- 兼容性:自动支持新的字段
- 通用性:支持跨平台跨语言
- 性能:编码长度和编码耗时
协议层
协议构造 协议解析
网络通信层
Sockets API TCP有限状态机
关键指标
稳定性
保障策略
- 熔断,保护调用方
- 限流,保护被调用方
- 超时控制,避免资源浪费
请求成功率
- 负载均衡
- 重试
长尾请求
- 备份请求
解决稳定性的手段,采用注册中间件的方式
易用性
- 开箱即用 default+doc
- 周边工具 脚手架
扩展性
- middleware
- option
- 编解码层
- 协议层
- 网络传输层
- 代码扩展工具
观测性
- log,Metric(监控),Tracing
- 内置观测服务
高性能
场景
- 单机多级
- 单连接多链接
- 单/多连接
- 不同请求大小的请求包
- 不同请求类型
目标
- 高吞吐
- 低延迟
手段
- 连接池
- 多路复用
- 高性能编解码协议
- 高性能网络库
企业实践
字节内部框架
自研网络库
- 原生网络库无法感知连接状态
- 原生库存在goroutine暴涨风险
netpoll
- 引入epoll主动建通感知连接状态
- 建立连接池复用goroutine
- 引入Nocopy Buffer,编解码层零拷贝
性能优化
- 网络库优化
- 调度优化
- LinkedBuffer
- Pool
- 编解码优化
- Codegen
- JIT
- 合并部署
标题:RPC 框架分层设计 - 掘金