基本概念
RPC需要解决的问题
1.函数映射
2.数据转换成字节流
3.网络传输
一次RPC的完整过程
IDL (Interface description language)文件IDL 通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信
生成代码
通过编译器工具把 IDL 文件转换成语言对应的静态库
编解码
从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化
通信协议
规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据
网络传输
通常基于成熟的网络库走 TCP/UDP 传输
RPC的好处
1.单一职责,有利于分工协作和运维开发
2.可扩展性强,资源使用率更优
3.故障隔离,服务的整体可靠性更高
RPC带来的问题
1.服务宕机,对方应该如何处理?
2.在调用过程中发生网络异常,如何保证消息的可达性?
3.请求量突增导致服务无法及时处理,有哪些应对措施?
分层设计
编解码层
语言特定的格式
文本格式
二进制格式
协议层
LENGTH: 数据包大小,不包含自身
HEADER MAGIC:标识版本信息,协议解析时候快速校验
SEQUENCE NUMBER: 表示数据包的 seqlD.可用于多路复用,单连接内递增
HEADER SIZE: 头部长度,从第14个字节开始计算一直到 PAYLOAD前
PROTOCOL ID:编解码方式,有 Binary 和Compact 两种
TRANSFORM ID: 压缩方式,如 zlib 和 snappy
INFO ID: 传递一些定制的 meta 信息
PAYLOAD: 消息体
网络通信层
Sockerts API
- 提供易用 API 封装底层 Socket API连接管理和事件分发
- 功能 协议支持: tcp、udp 和 uds 等优雅退出、异常处理等
- 性能 应用层 buffer 减少 copy 高性能定时器、对象池等
关键指标
稳定性 - 保障策略
熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路
限流:保护被调用方,防止大流量把服务压垮
超时控制:避免浪费资源在不可用节点上
高性能
小结
1.框架通过中间件来注入各种服务治理策略,保障服务的稳定性 2.通过提供合理的默认配置和方便的命令行工具可以提升框架的易用性 3.框架应当提供丰富的扩展点,例如核心的传输层和协议层 4.观测性除了传统的 Log、Metric 和 Tracing 之外,内置状态暴露服务也很有必要 5.性能可以从多个层面去优化,例如选择高性能的编解码协议和网络库
企业实践
整体架构
自研数据库
扩展性设计
网络库的优化
调度优化
epoll_wait 在调度上的控制 gopool 重用 goroutine 降低同时运行协程数
LinkBuffer
读写并行无锁,支持 nocopy 地流式读写 高效扩缩容 Nocopy Buffer 池化,减少 GC
Pool
引入内存池和对象池,减少 GC 开销
总结
学习RPC框架,围绕RPC框架的好处以及需要解决的问题,介绍RPC框架的一些设计,学习了框架核心的三层,然后围绕RPC框架的核心指标,最后分享了字节跳动高性能 RPC 框架 Kitex 的相关实践。