RPC框架分层设计| 青训营

76 阅读2分钟

RPC框架分层设计

基本概念

远程函数调用需要解决的问题

1、函数映射

2、数据转换成字节流

3、网络传输

完整RPC过程

约定规范:IDL文件(接口描述语言)

生成代码:

编解码:

通信协议:

网络传输:

RPC的优势

  1. 单一职责
  2. 可扩展性强
  3. 故障隔离

RPC问题

  1. 宕机
  2. 网络异常无法保证可达性
  3. 请求激增

分层设计

编解码层|协议层|网络通信层

IDL文件转换为了不同欲来的lib代码

编解码层-生成代码 客户端与服务端依赖同一份IDL文件

数据格式(IDL文件)

  • 语言特定的格式:缺乏兼容性
  • 文本格式:可读但不精确 JSON,CSV等
  • 二进制格式:跨语言和高性能 TVL等

编码层选型

  • 兼容性:自动支持新的字段
  • 通用性:支持跨平台跨语言
  • 性能:编码长度和编码耗时

协议层

协议构造 协议解析

网络通信层

Sockets API TCP有限状态机

关键指标

稳定性

保障策略

  • 熔断,保护调用方
  • 限流,保护被调用方
  • 超时控制,避免资源浪费

请求成功率

  • 负载均衡
  • 重试

长尾请求

  • 备份请求

解决稳定性的手段,采用注册中间件的方式

易用性

  • 开箱即用 default+doc
  • 周边工具 脚手架

扩展性

  • middleware
  • option
  • 编解码层
  • 协议层
  • 网络传输层
  • 代码扩展工具

观测性

  • log,Metric(监控),Tracing
  • 内置观测服务

高性能

场景

  • 单机多级
  • 单连接多链接
  • 单/多连接
  • 不同请求大小的请求包
  • 不同请求类型

目标

  • 高吞吐
  • 低延迟

手段

  • 连接池
  • 多路复用
  • 高性能编解码协议
  • 高性能网络库

企业实践

字节内部框架

自研网络库

  • 原生网络库无法感知连接状态
  • 原生库存在goroutine暴涨风险

netpoll

  • 引入epoll主动建通感知连接状态
  • 建立连接池复用goroutine
  • 引入Nocopy Buffer,编解码层零拷贝

性能优化

  1. 网络库优化
    • 调度优化
    • LinkedBuffer
    • Pool
  2. 编解码优化
    • Codegen
    • JIT
  3. 合并部署

标题:RPC 框架分层设计 - 掘金

网址:juejin.cn/course/byte…