分析抖音的互联网框架-RPC(远程过程调用协议)
原文链接深入浅出 RPC 框架 副本.pptx - 飞书云文档 (feishu.cn)
一、基本概念
1.RPC需要解决的问题
- 函数映射
- 数据转换成字节流
- 网络传输
2.RPC概念模型
- user(服务调用方)
- user-stub(调用方的本地存根)
- RPCRuntime(RPC通信者)
- server-stub(服务端的本地存根)
- server(服务端)
3.一次RPC的完整过程
IDL文件(interface description lanuage)
- 通过一种中立的方式去描述接口,使得在不同平台上运行的对象和用不同语言编写的程序得以通信。
生成代码
- 通过编译器工具把IDL文件转换成语言对应的静态库。
编解码
- 从内存中表示到字节序列的转换称为编码,反之为解码,叫做序列化和反序列化。
通信协议
- 规划数据在网络中的传输格式和内容,除必须的请求和响应数据外,通常还会包括额外的元数据。
网络传输
- 基于成熟的网络库走向TCP/UDP传输
4.RPC的好处
- 单一职责,有利于分工协助和运维开发
- 可扩展性强,资源使用率更优
- 故障隔离,服务的整体可靠性更高
二、分层设计
1.以Apache Thrift为例
图片来源于深入浅出 RPC 框架 副本.pptx - 飞书云文档 (feishu.cn)
2.编解码层-数据格式
- 语言特定的格式:许多编程语言都内建了将内存对象编码为字节序列的支持
- 文本格式:JSON、CSV、XML
- 二进制编码:具备跨语言和高性能等优点,常见有Thrift的BinaryProtocol,Protobuf等
3.协议层
协议是双方确定的交流语义,比如:设计一个字符串的传输协议,它允许客户端发送一个字符串,服务端接收到对应的字符串。 协议构造
- LENGTH:数据包大小,不包含自身。
- HEADER MAGIC:标识版本信息,解析协议时快速校验。
- SEQUENCE NUMBER:表示数据包的seqID,可用于多路复用,单连接内递增。
- HEADER SIZE:头部长度,从第14个字节开始计算一直到PAYLOAD前。
- PROTOCOLID:编解码方式,有Binary和Compact两种。
- TRANSFORM ID:压缩方式有zlib和snappy
- INFO ID:传递一些定制的meta信息
- PAYLOAD:消息体。
4.网络通信层
- 提供易用API:封装底层Socket API;连接管理和事件分发
- 功能:协议支持tcp,udp,uds等;优雅退出,异常处理等
- 性能:应用层Buffer减少copy,高性能定时器、对象池等
三、关键指标
1.稳定性-保障策略
- 熔断:保护调用方,防止被调用的服务出现问题而影响整个链路。
- 限流:保护被调用方,防止大流量把服务压垮
- 超时控制:避免浪费资源在不可用节点上
2.易用性
- 开箱即用:合理的默认参数选项、丰富的文档
- 周边工具:生成代码工具、脚手架工具
3.小节
- 框架通过中间件来注入各种服务治理策略,保障服务的稳定性。
- 提供合理的默认配置和方便的命令行工具可以提升框架的易用性。
- 框架应当提供丰富的扩展点,例如核心的传输层和协议层。
- 观测性除了传统的Log、Metric和Tracing之外,内置状态暴露服务也很有必要
- 性能可以从多个层面去优化,例如选择高性能的编解码协议和网络库