这是我参与「第五届青训营 」伴学笔记创作活动的第11天
本文为青训营课程笔记,配合原课程食用效果更佳哦~
课程笔记
RPC之Kitex设计
整体架构 - Kitex
- **Kitex Core:**核心组件
- Kitex Byted:与公司内部基础设施集成
- Kitex Tool:代码生成工具
自研网络库
-
背景
-
原生库无法感知连接状态
- 在使用连接池时,池中存在失效连接,影响连接池的复用。
-
原生库存在 goroutine 暴涨的风险
- 一个连接一个 goroutine 的模式,由于连接利用率低下,存在大量 goroutine 占用调度开销,影响性能。
-
-
Netpoll
-
解决无法感知连接状态问题
- 引入 epoll 主动监听机制,感知连接状态
-
解决 goroutine 暴涨的风险
- 建立 goroutine 池,复用 goroutine
-
提升性能
- 引入 Nocopy Buffer,向上层提供 NoCopy 的调用接口,编解码层面零拷贝
-
-
扩展性设计
- 支持多协议,也支持灵活的自定义协议扩展
性能优化 - 网络库优化
-
调度优化
-
epoll_wait 在调度上的控制
-
gopool 重用 goroutine 降低同时运行协程数
-
-
LinkBuffer
-
读写并行无锁,支持 nocopy 地流式读写
-
高效扩缩容
-
Nocopy Buffer 池化,减少 GC
-
-
Pool
- 引入内存池和对象池,减少 GC 开销
性能优化 - 编解码优化
-
Codegen
-
预计算并预分配内存,减少内存操作次数,包括内存分配和拷贝
-
Inline 减少函数调用次数和避免不必要的反射操作等
-
自研了 Go 语言实现的 Thrift IDL 解析和代码生成器,支持完善的 Thrift IDL 语法和语义检查,并支持了插件机制
-
-
Thriftgo
-
JIT
-
使用 JIT 编译技术改善用户体验的同时带来更强的编解码性能,减轻用户维护生成代码的负担
-
基于 JIT 编译技术的高性能动态 Thrift 编解码器
-
合并部署
-
微服务过微,传输和序列化开销越来越大
-
将亲和性强的服务实例尽可能调度到同一个物理机,远程 RPC 调用优化为本地 IPC 调用
-
中心化的部署调度和流量控制
-
基于共享内存的通信协议
-
定制化的服务发现和连接池实现
-
定制化的服务启动和监听逻辑
小结
-
介绍了 Kitex 的整体架构
-
介绍了自研网络库 Netpoll 的背景和优势
-
从扩展性和性能优化两个方面分享了相关实践
-
介绍了内部正在尝试落地的新的微服务形态:合并部署
总结收获
通过样例与知识点结合的方式,学到了一些Kitex设计的知识;
通过样例的讲解,更了解了具体的Kitex设计方法;
又是收获满满的一天
引用参考
青训营官方课程视频
青训营官方课程文档
青训营官方课程笔记