RPC关键指标分析与企业实践
一、关键指标
① 稳定性:
(1) 保障策略
1. 熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路
2. 限流:保护被调用方,防止大流量把服务压垮
3. 超时控制:避免浪费资源在不可用节点上
(2) 请求成功率
(2) 长尾请求
(3) 注册中间件
(超时、熔断、重试、限流、负载均衡、BackupRequest)
② 易用性
(1) 开箱即用:合理的默认参数选项、丰富的文档
(2) 周边工具:生成代码工具、脚手架工具
简单易用的行命令工具:
1. 生成服务代码脚手架
2. 支持protobuf和thrift
3. 内置功能丰富的选项
4. 支持自定义的生成代码插件
③ 扩展性
(1) Middleware
(2) Option
(3) 编解码层
(4) 协议层
(5) 网络传输层
(6) 代码生成工具插件扩展
② 观测性
(1)Log、Metric、Tracing (2)内置观测性服务
③ 高性能
(1) 场景
1. 单机多机
2. 单连接多连接
3. 单/多client、单/多server
4. 不同大小的请求包
5. 不同请求类型,例如:pingpong、streaming等
(2) 目标
1. 高吞吐 2.低延迟
(3) 手段
1. 连接池 2.多路复用 3.高性能编解码协议 4.高性能网络库
二、企业实践
① 整体架构——Kitex
1.Kitex Core:核心组件 2.Kitex Byted:与公司内部基础设施集成 3.Kitex Tool:代码生成工具
② 自研网络库
(1) 背景
2. 原生库无法感知连接状态:在使用连接池时,池中存在失效连接,影响连接池的复用
3. 原生库存在goroutine暴涨的风险:一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
(2) Netpoll
1. 解决无法感知连接状态问题:引入epoll主动监听机制,感知连接状态
2. 解决goroutine暴涨的风险:建立goroutine池,复用goroutine
3. 提升性能:引入Nocopy Buffer,向上层提供Nocopy的调用接口,编解码层面零拷贝
③ 扩展性设计
支持多协议,也支持灵活的自定义协议扩展:
④ 性能优化
(1) 网络库优化
1. 调度优化:epoll——wait在调度上的控制;gopool重用goroutine降低同时运行协程数
2. LinkBuffer:读写并行无锁,支持nocopy地流式读写;高效扩缩容;Nocopy Buffer池化,减少GC
3. Pool:引入内存池和对象池,减少GC开销
(2) 编解码优化
⑤ 合并部署
(1) 微服务过微,传输和序列化开销越来越大
(2) 将亲和性强的服务实例尽可能调度到同一个物理机,远程RPC调用优化为本地IPC调用