RPC框架的基础理解 | 青训营

171 阅读4分钟

from: 字节跳动-内部课程(掘金)( bytedance.feishu.cn/file/boxcn5… )
author: June
created: 2023-08-01 14:52
tags: #course


0. 课程资料

  1. RPC的概念模型
  2. THeader 协议
  3. 字节内部 Kitex 实践分享
  4. 官方文档
  5. 字节跳动 Go RPC 框架 KiteX 性能优化实践_架构_字节跳动技术团队_InfoQ精选文章
  6. 字节跳动微服务架构体系演进_架构_字节跳动技术团队_InfoQ精选文章

1. 基本概念

  • 本地函数调用 与 远程函数调用 (Remote Procedure Calling, RPC)

  • RPC 需要解决的问题

    • 函数映射:eg. 怎么告诉支付服务需要调用付款函数,本地调用是通过函数指针,但是 RPC 中两个进程的地址空间是不同的,每个函数有自己的 ID,需要通过这个 ID 找到函数执行。
    • 数据转换成字节流:eg. 本地调用中参数是压栈去读的,RPC 时不能直接通过内存读参,这里就需要字节流作为中间形式,客户端把参数转成字节流,服务端把字节流转为能读取的形式
    • 网络传输:RPC 往往用在网络上,需要高速稳定的传输数据
  • RPC 概念模型

    • User,User-stub,RPCRoutine,Server-stub,Server

1. 深入浅出RPC框架_image_1.png

  • RPC 实际过程
    • IDL (Interface description language)文件,接口描述语言文件,作为中立描述方式,不同平台和不同语言可以相互通信
    • 生成代码:通过编译工具把 IDL 文件转换为语言对应的静态库
    • 编解码:内存中表示->字节序列(称为编码),反之解码;也称为序列化和反序列化
    • 通信协议:规范传输内容和格式,请求和响应数据+元数据
    • 网络传输:基于成熟的网络库的 TCP/UDP 传输

1. 深入浅出RPC框架_image_2.png

  • RPC 的好处

    • 单一职责,利于分工与协作
    • 可扩展性强,资源使用率高
    • 故障隔离,整体可靠性变高
  • RPC 带来的问题->需要设计个优雅的框架

    • 服务宕机,如何处理
    • 网络异常,消息如何可达
    • 请求量突增,服务如何应对

2. 分层设计

  • Apache Thrift 的分层设计 *

1. 深入浅出RPC框架_image_3.png

编解码层

  • 编解码层不同的数据格式
    • 语言特定格式:eg. java. io. serializable,强制绑定,安全和兼容问题
    • 文本格式:eg. JSON, XML, CSV,人类可读性,但是可能有歧义,另外可能反射机制导致性能不佳
    • 二进制编码:eg. 常见 Thrift 的 BinaryProtocol,ProtoBuf 等,跨语言+高性能,实现有 TLV 编码和 Varint 编码
  • 二进制编码之 TLV 编码(Tag, Length, Value),
  • 编解码层不同的选型
    • 兼容性:新老服务
    • 通用性:技术层面跨平台,跨语言;流行程度,序列化与反序列化
    • 性能:空间压缩,编码时长、

协议层

  • 协议层的一些概念
    • 特殊结束符 与 变长协议
    • 协议构造:LENGTH, HEADER MAGIC, SEQUENCE NUMBER, HEADER SIZE, PROTOCOL ID, TRANSFORM ID, INFO ID, PAYLOAD
    • 协议解析:Peek->MagicNumber->Peek->PayloadCodec->Decode->Payload

网络通信层

  • 网路通信层
    • 套接字编程 Sockets Programming
    • 网络库
      • 提供 API:对底层 Socket API 封装;连接管理和事件分发
      • 功能:协议支持: tcp, udp, uds 等;优雅退出,异常处理
      • 性能:应用层 buffer 减少 copy,高性能定时器、对象池等

1. 深入浅出RPC框架_image_4.png

3. 关键指标

稳定性

  • 保障策略
    • 熔断
    • 限流
    • 超时控制
    • 某种程度上讲,以上三种都是降级服务
  • 请求成功率
    • 负载均衡
    • 重试:有放大故障的风险,防止重试风暴,限制单点重试和限制链路重试
  • 长尾请求
    • 一般是指明显高于均值的那部分占比较小的请求
    • P99标准:99%的请求延迟要满足在一定耗时以内, 1%的请求会大于这个耗时, 而这1%就可以认为是长尾请求。
    • 可能的原因:网络抖动,GC,系统调度
    • 可能的方案:阈值重发
  • 注册中间件
    • Kitex Client 和 Server 的创建接]均采用 Option 模式,提供了极大的灵活性,很方便就能注入这些稳定性策略

易用性

  • 开箱即用
  • 周边工具

扩展性

  • 多个 middleware 逐个执行

观测性

  • Log, Metric, Tracing
  • 内置观测服务:如环境变量、配置、参数、缓存信息等

高性能

  • 高吞吐 与 低延迟
  • 常用手段:连接池,多路复用,高性能编解码协议,高性能网络库