这是我参与「第五届青训营 」笔记创作活动的第14天
RPC原理与实现
一、本堂课重点内容:
本堂课的知识要点有哪些?
- RPC 相关的基本概念
- RPC 框架的分层设计
- 衡量 RPC 框架的一些核心指标
- 字节内部 RPC 框架 Kitex 实践分享
二、详细知识点介绍:
本堂课介绍了哪些知识点?
- RPC 相关的基本概念
-
RPC的概念模型:User、User-Stub、RPC-Runtime、Server-Stub、Server
-
IDL(Interface Definition Language) 文件
- Thrift
- Protobuf
-
生成代码
-
编解码(序列化/反序列化)
-
通信协议
- 应用层协议
-
网络通信
- IO 网络模型
- blocking IO
- unblocking IO
- IO multiplexing
- signal driven IO
- asynchronous IO
- 传输层协议
- TCP
- UDP
- IO 网络模型
-
- RPC 框架的分层设计
- 编解码层
- 数据格式:
- 语言特定格式
- 文本格式
- 二进制编码
- TLV 编码:Thrift 使用 TLV 编码
- Varint 编码:Protobuf 使用 Varint 编码
- 选项:
- 兼容性
- 通用型
- 性能
- 数据格式:
- 传输协议层
- 消息切分
- 特殊结束符
- 变长协议:length+body
- 协议构造
- 以 Thrift 的 THeader 协议为例讲解
- 消息切分
- 网络通信层
- 网络库
- 核心指标
- 吞吐高
- 延迟低
- 编解码层
- 衡量 RPC 框架的一些核心指标
- 稳定性
- 保障策略
- 熔断
- 限流
- 超时
- 请求成功率
- 负载均衡
- 重试
- 长尾请求
- BackupRequest
- 易用性
- 开箱即用
- 周边工具
- 扩展性
- 观测性
- Log
- Metric
- Tracing
- 内置观测性服务
- 高性能
- 字节内部 RPC 框架 Kitex 实践分享
- 合并部署
三、实践练习例子:
有什么实践举例帮助理解知识点?
-
字节内部的Kitex实践
- 框架文档 Kitex
-
自研网络库 Netpoll,背景:
- a. 原生库无法感知连接状态
- b. 原生库存在 goroutine 暴涨的风险
-
扩展性:支持多协议,也支持灵活的自定义协议扩展
-
性能优化,参考 字节跳动 Go RPC 框架 KiteX 性能优化实践
-
a. 网络优化
- i. 调度优化
- ii. LinkBuffer 减少内存拷贝,从而减少 GC
- iii. 引入内存池和对象池
-
b. 编解码优化
- i. Codegen:预计算提前分配内存,inline,SIMD等
- ii. JIT:无生产代码,将编译过程移到了程序的加载(或首次解析)阶段,可以一次性编译生成对应的 codec 并高效执行
-
合并部署
- a. 微服务过微,引入的额外的传输和序列化开销越来越大
- b. 将强依赖的服务统计部署,有效减少资源消耗
四、课后个人总结:
本章有什么知识点不容易掌握?
- 本地函数调用和RPC调用的区别:函数映射、数据转成字节流、网络传输
- RPC的概念模型:User、User-Stub、RPC-Runtime、Server-Stub、Server
- 一次PRC的完整过程,并讲解了RPC的基本概念定义
- RPC带来好处的同时也带来了不少新的问题,将由RPC框架来解决
什么地方容易与其他内容混淆?
五、引用参考:
- 我参考了哪些外部博客/笔记/文章?
- 文章中有什么地方是我参考引用了外部博客/笔记/文章的