这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
课程概要
- RPC 相关的基本概念
- RPC 框架的分层设计
- 衡量 RPC 框架的一些核心指标
- 字节内部 RPC 框架 Kitex 实践分享
分层设计
以Apache Thrift为例
ps:右边的Service.client 改为 Service.Processor
编解码层
Client和Server依赖同一份IDL文件,以此去生成不同语言的CodeGen
数据格式
- 语言特定的格式:许多语言都内建了讲内存对象编码为字节序列的支持
- 文本格式:JSON、XML、CSV等文本格式,具有人类可读性
- 二进制编码:具备跨语言和高性能等优点,常见有Thrift的BinaryProtocol、Protobuf等
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长
协议层
概念
- 特殊结束符:一个特殊字符作为每个协议单元结束的标示
- 变长协议:以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度
协议构造
- LENGTH: 数据包大小,不包含自身
- HEADER MAGIC: 标识版本信息,协议解析时候快速校验
- SEQUENCE NUMBER: 表示数据包的seqID,可用于多路复用,单连接内递增
- HEADER SIZE: 头部长度,从第14个字节开始计算一直到PAYLOAD前
- PROTOCOL ID: 编解码方式,如Binary和Compact两种
- TRANSFORM ID: 压缩方式,如zlib和snappy
- INFO ID: 传递一些定制的meta信息
- PAYLOAD: 消息体
协议解析
网络通信层
SOCKET API 调用流程
网络库
-
提供易用API:
- 封装底层 Socket API
- 连接管理和事件分发
-
功能:
- 协议支持:tcp、udp和uds等
- 优雅退出、异常处理
-
性能:
- 应用层buffer减少copy
- 高性能定时器、对象池等