技术学习总结 12 | 青训营

117 阅读2分钟

RPC关键指标分析与企业实践

一、关键指标

①   稳定性:

(1)       保障策略

1.       熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路

2.       限流:保护被调用方,防止大流量把服务压垮

3.       超时控制:避免浪费资源在不可用节点上

image.png

(2)       请求成功率

image.png

(2)       长尾请求

image.png

(3)       注册中间件

(超时、熔断、重试、限流、负载均衡、BackupRequest)

image.png

②   易用性

(1)       开箱即用:合理的默认参数选项、丰富的文档

(2)       周边工具:生成代码工具、脚手架工具

简单易用的行命令工具:

1.       生成服务代码脚手架

2.       支持protobuf和thrift

3.       内置功能丰富的选项

4.       支持自定义的生成代码插件

image.png

③   扩展性

(1)       Middleware

(2)       Option

(3)       编解码层

(4)       协议层

(5)       网络传输层

(6)       代码生成工具插件扩展

image.png

②   观测性

(1)Log、Metric、Tracing (2)内置观测性服务

image.png

③   高性能

(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:代码生成工具

image.png

②   自研网络库

(1)       背景

2.       原生库无法感知连接状态:在使用连接池时,池中存在失效连接,影响连接池的复用

3.       原生库存在goroutine暴涨的风险:一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能

(2)       Netpoll

1.       解决无法感知连接状态问题:引入epoll主动监听机制,感知连接状态

2.       解决goroutine暴涨的风险:建立goroutine池,复用goroutine

3.       提升性能:引入Nocopy Buffer,向上层提供Nocopy的调用接口,编解码层面零拷贝

③   扩展性设计

支持多协议,也支持灵活的自定义协议扩展:

image.png

④   性能优化

(1)       网络库优化

1.       调度优化:epoll——wait在调度上的控制;gopool重用goroutine降低同时运行协程数

2.       LinkBuffer:读写并行无锁,支持nocopy地流式读写;高效扩缩容;Nocopy Buffer池化,减少GC

3.       Pool:引入内存池和对象池,减少GC开销

(2)       编解码优化

image.png

⑤   合并部署

(1)       微服务过微,传输和序列化开销越来越大

(2)       将亲和性强的服务实例尽可能调度到同一个物理机,远程RPC调用优化为本地IPC调用

image.png image.png