这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记。本文主要介绍 RPC 框架的基本概念,重点讲解了 RPC 框架的核心三层:编解码层、协议层和网络传输层,探讨了 RPC 框架的关键指标,分享了字节跳动高性能 RPC 框架 Kitex 的相关内容。
1. RPC 框架的基本概念
1.1 什么是RPC
RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC它假定某些协议的存在,例如TPC/UDP等,为通信程序之间携带信息数据。在OSI网络七层模型中,RPC跨越了传输层和应用层,RPC使得开发,包括网络分布式多程序在内的应用程序更加容易。
1.2 一次 RPC 的完整过程
IDL (Interface description language)文件
IDL 通过一种中立的方式来描述接口,使得不同平台上运行的对象和用不同语言编写的程序可以互相通信。
生成代码
通过编译器工具把 IDL 文件转换为语言对应的静态库
编解码
从内存中表示到字节序列的转化称为编码,反之称为解码。
通信协议
规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据。
网络传输
通常基于成熟的网络库,走 TCP/UDP 传输
1.3 RPC 的好处
- 单一职责,有利于分工写作和运维开发
- 可扩展性强,资源使用率更优
- 故障隔离,服务的整体可靠性更高
2. RPC 框架的分层设计
2.1 整体框架
举例:Apache Thrift
2.2 编解码层
- 语言特定的格式:例如 Java 有 java.io.Serializable
- 文本格式:例如 JSON、XML、CSV 等文本格式
- 二进制编码:具备跨语言和高性能等优点
- TLV 编码:Thrift 的 BinaryProtocol
- Varint 编码:Protobuf
2.3 协议层
0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 4 5 6 7 8 9 a b c d e f
+----------------------------------------------------------------+
| 0| LENGTH |
+----------------------------------------------------------------+
| 0| HEADER MAGIC | FLAGS |
+----------------------------------------------------------------+
| SEQUENCE NUMBER |
+----------------------------------------------------------------+
| 0| Header Size(/32) | ...
+---------------------------------
Header is of variable size:
(and starts at offset 14)
+----------------------------------------------------------------+
| PROTOCOL ID (varint) | NUM TRANSFORMS (varint) |
+----------------------------------------------------------------+
| TRANSFORM 0 ID (varint) | TRANSFORM 0 DATA ...
+----------------------------------------------------------------+
| ... ... |
+----------------------------------------------------------------+
| INFO 0 ID (varint) | INFO 0 DATA ...
+----------------------------------------------------------------+
| ... ... |
+----------------------------------------------------------------+
| |
| PAYLOAD |
| |
+----------------------------------------------------------------+
2.4 网络通信层 - Sockets API
3. RPC 框架的关键指标
3.1 稳定性
- 保障策略:熔断、限流、超时控制
- 请求成功率:负载均衡、重试
- 长尾请求:Backup Request
- 注册中间件
3.2 易用性
- 开箱即用
- 合理的默认参数选项,丰富的文档
- 周边工具
- 生成代码工具,脚手架工具
3.3 扩展性
3.4 观测性
- Log 日志
- Metric 监控
- Tracing 链式跟踪
- 内置观测性服务
3.5 高性能
- 目标:高吞吐、低延迟
- 手段:连接池、多路复用、高性能编解码协议、高性能网络库
4. 字节企业实践
4.1 整体框架 - Kitex
- Kitex Core:核心组件
- Kitex Byted:与公司内部基础设施集成
- Kitex Tool:代码生成工具
4.2 自研网络库 - Netpoll
4.3 编解码优化
- Codegen 自研了 GO 语言实现的 Thrift IDL 解析和代码生成器
- JIT 即时编译技术 基于 JIT 编译技术的高性能动态 Thrift 编解码器 - Frugal
4.4 合并部署
将亲和性强的服务实例尽可能调度到同一个物理机,远程RPC调用优化为本地IPC调用。