这是我参与「第五届青训营」伴学笔记创作活动的的第13天
RPC关键指标分析与企业实践
指标分析
1.稳定性
1.保障策略:
熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路。
限流:保护被调用方,防止大流量把服务压垮。
超时控制:避免浪费资源在不可用节点上。
2.请求成功率
3.长尾请求
4.注册中间件
2.易用性
开箱即用:合理的默认参数选项、丰富的文档。
周边工具:生成代码工具、脚手架工具。
简单易用的命令行工具:
1.生成服务代码脚手架
2.支持protobuf和thrif t
3.内置功能丰富的选项
4.支持自定义的生成代码插件
3.扩展性
Middleware
Option
编解码层
协议层
网络传输层
代码生成工具插件扩展
4.观测性
Log、Metric、Tracing
内置观测性服务
5.高性能
场景:
1.单机多机
2.单连接多连接
3.单/多client单/多server
4.不同大小的请求包
5.不同请求类型:例如pingpong.streaming等
目标:
1.高吞吐
2.低延迟
手段:
1.连接池
2.多路复用
3.高性能编解码协议
4.高性能网络库
企业实践
1.整体架构
Kitex Core:核心组件
Kitex Byted:与公司内部基础设施集成
Kitex Tool:代码生成工具
2.自研网络库
1.问题:
原生库无法感知连接状态:在使用连接池时,池中存在失效连接,影响连接池的复用。
原生库存在goroutine暴涨的风险:一个连接一个goroutine 的模式,由于连接利用率低下,存在大量 goroutine 占用调度开销,影响性能。
2.Netpoll
解决无法感知连接状态问题:引入epoll主动监听机制,感知连接状态
解决goroutine暴涨的风险:建立goroutine池,复用goroutine
提升性能:引入Nocopy Buffer,向上层提供NoCopy的调用接口,编解码层面零拷贝
3.性能优化
Codegen:
1.预计算并预分配内存,减少内存操作次数,包括内存分配和拷贝
2.Inline 减少函数调用次数和避免不必要的反射操作等
3.自研了Go语言实现的Thrift IDL解析和代码生成器,支持完善的 Thrift IDL语法和语义检查,并支持了插件机制-Thriftgo
JIT
1.使用JIT编译技术改善用户体验的同时带来更强的编解码性能,减轻用户维护生成代码的负担
2.基于JIT编译技术的高性能动态Thrift编解码器- Frugal