go框架设计3 | 青训营笔记

65 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的的第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