深入浅出 RPC 框架 | 青训营笔记

130 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记

RPC

需要解决以下问题:

  • 函数映射
  • 数据转换为字节流(序列化)
  • 网络传输

对于 RPC 带来的问题,需要通过 RPC 框架解决

分层设计

基本的RPC框架设计分为以下几层:

  • Client/Serve
  • Encode/Decode
  • Protocol
  • Transport

image.png

编码解码层
  • IDL(数据格式)

    • 语言自带 (JAVA.SERIALIZEABLE, GO.GOB)

      语言自带序列化非常的方便,但是存在语言之间互不兼容的问题

    • 文本(JSON, XML, CSV)

    • 二进制 (protobuf、thrift.BinaryProtocol)

      • TLV 编码

      二进制序列化的效率是最高的,但是相对于 JSON 等文本格式来说对人不友好,人无法读懂二进制串,但是可以看懂 JSON 数据,所以一般在前后端传输使用 JSON 格式,后端内部使用二进制序列化。

    • 目标

      • 兼容性:可以新增字段不影响原来服务
      • 通用性:跨平台,跨语言
      • 性能:数据小,速度快
协议层
  • 协议层:protocol

    • 自定义协议结构
    • 特殊结束符:etc. \r\n
    • 变长协议:length 描述
传输层
  • 传输层:Sockets API

    • 需求

      • 易用
      • 功能 -> tcp, udp, uds, 退出, 异常处理
      • 性能 -> 应用层 buffer 减少 copy

关键指标

  • 稳定性:熔断, 限流, 超时控制,这三种都算是服务降级的手段

    • 防止某个被调用服务出问题导致停滞

    • 防止大流量把服务压垮

    • 防止浪费资源在不可用节点

    • 请求成功率:负载均衡, 重试

    • 长尾请求:P99,也就是处理时间排在 % 99 以后的请求, 使用 backup request 处理

      backup request:设定一个预期时间,如果超过时间未收到响应就重发请求

  • 易用性:开箱即用, 周边工具

    • 合理的默认参数选项,丰富的文档
    • 生成代码工具,脚手架工具
  • 扩展性:支持插件,核心层支持扩展,支持自定义参数

  • 观测性:log, tracing, metric, 内置观测服务

内置观测性服务是指用于观测框架内部状态的服务,例如查看环境变量,配置参数,缓存,pprof

  • 高性能:高吞吐, 低延迟

    • 场景:单/多机, 单/多连接, 单/多client/server, 不同请求包大小, 不同请求类型

    • 手段:

      • 连接池, 多路复用,:复用连接,减少频繁建联
      • 高性能编解码工具,协议:Thrift,Protobuf
      • 高性能网络库:Netpoll,Netty