这是我参与「第五届青训营 」笔记创作活动的第14天
RPC框架分层设计 1基本概念 2分层设计 3关键指标 4企业实践
1基本概念 1.1本地函数调用
1.2远程函数调用RPC-Remote Procedure Calls 需要解决的问题 1函数映射 2数据转换成字节流 传参 3网络传输 高效稳定
1.3RPC概念模型
1.4一次RPC的完整过程 IDL文件Interference description language 生成代码 编解码 通信协议 网络传输
1.5RPC的好处 1单一职责 有利于分工协作和运维开发 2可拓展性强 资源使用率更优 3故障隔离 服务整体可靠性更高
1.6RPC带来的问题 服务宕机 对方该如何处理 调用过程中网络异常 请求量突增服务无法完全处理
1小结 1本地函数和RPC调用区别 函数映射 数据转成字节流 网络传输 2RPC概念模型User User-Stub RPC-Runtime Server-Stub Server 3一次RPC完整过程 RPC基本概念定义 4RPC好处及带来的问题 由RPC框架解决
2分层设计 编解码 协议 网络通信层 2.1Apache Thrift为例 2.2编解码层 2.3-生成代码
2.4-数据格式 语言特定的格式 文本格式 具有人类可读性 二进制编码 具备跨语言和高性能等优点
2.5-二进制编码 TLV编码 Tag标签 (类型) Length长度 Value值
2.6-选型 兼容性 支持自动增加新字段 提高系统灵活度 通用性 跨平台 跨语言 性能 空间时间维度考虑
2.7协议层 2.8-概念 特殊结束符 变长协议
2.9-协议构造SDD LENGTH 数据包大小 HEADER MAGIC 标识版本信息 SEQUENCE NUMBER 表示数据包 seqID HEADER SIZE 头部长度 PROTOCOL ID 编解码方式 TRANSFORM ID 压缩方式 INFO ID 传递定制meta消息 PAYLOAD 消息体
2.1.0-协议解析
2.11网络通信层 2.12-socket API
2.13-网络库 提供易用API 封装底层Socket API 连接管理和事件分发 功能 协议支持 tcp udp uds等 优雅退出 异常处理等 性能 应用层buffer减少copy 高性能定时器、对象池等
2小结 RPC框架主要核心三层:编解码层 协议层 网络通信层 二进制编解码原理的实现原理和选型要点 协议的一般构造以及框架协议解析的基本流程 网络库的基本架构 选型时要考察的核心指标
3关键指标 稳定 易用 扩展 观测 高性能 3.1稳定性-保障策略 熔断 限流 超时控制
3.2-请求成功率 负载均衡 重试
3.3-长尾请求 Backup Request
3.4-注册中间件
3.5易用性 开箱即用 合理默认参数选项 丰富的文档 周边工具 生成代码工具 脚手架工具
3.6扩展性 Middleware Option 编解码层 协议层 网络传输层 代码生成工具插件扩展
3.7观测性 Log Metric Tracing 内置观测性服务
3.8高性能 场景 单机多机 单连接多连接 单/多client 单/多server 不同大小的请求包 不同请求类型
目标 高吞吐 低延迟
手段 连接池 多路复用 高性能编解码协议 高性能网络库
3小结 框架通过中间件来注入各种服务治理策略 保障服务的稳定性 通过提供合理默认配置方式和方便的命令行工具可提升框架易用性 框架应当提供丰富的扩展点 观测性处了传统Log Metric Tracing 内置状态暴露服务也很有必要 性能可以从多个层面去优化 如选择高性能编解码协议和网络库
企业实践 整体架构 自研网络库 扩展性设计 性能优化 合并部署
4.1整体架构-Kitex Kitex Core 核心组件 Kitex Byted 与公司内部基础设施集成 Kitex Tool 代码生成工具
4.2自研网络库-背景 原生库无法感知连接状态 原生库存在goroutine暴涨的风险
4.3-Netpoll 解决无法感知连接状态问题 解决goroutine暴涨的风险 提升性能
4.4扩展性设计 支持多协议 灵活自定义协议扩展
4.5性能优化-网络库优化 调度优化 LinkBuffer Pool
4.6-编解码优化 Codegen 预计算 预分配内存 Iline减少函数调用次数和避免不必要反射操作 Thrift IDL解析和代码生成器 支持完整Thrift IDL 语法和语义检查 实现插件机制Thriftgo JIT just in time基于JIT编译技术改善用户体验同时带来更强的编解码性能 减轻用户维护生成代码负担 高性能动态Thrift编解码器 Frugal
4.7合并部署 微服务过微传输和序列化开销越来越大 将亲和性服务实例尽可能调度到同一个物理机 远程RPC调用优化为本地IPC调用
中心化部署调度和流量控制 基于共享内存的通信协议 定制化的服务发现和连接池实现 定制化服务启动和监听逻辑
4小结 介绍了Kitex Netpoll背景和优势 扩展性和性能优化两个方面相关实践 内部正尝试落地新的微服务形态 合并部署