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

119 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记。本文主要介绍 RPC 框架的基本概念,重点讲解了 RPC 框架的核心三层:编解码层、协议层和网络传输层,探讨了 RPC 框架的关键指标,分享了字节跳动高性能 RPC 框架 Kitex 的相关内容。

1. RPC 框架的基本概念

1.1 什么是RPC

RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC它假定某些协议的存在,例如TPC/UDP等,为通信程序之间携带信息数据。在OSI网络七层模型中,RPC跨越了传输层和应用层,RPC使得开发,包括网络分布式多程序在内的应用程序更加容易。

1.2 一次 RPC 的完整过程

IDL (Interface description language)文件
IDL 通过一种中立的方式来描述接口,使得不同平台上运行的对象和用不同语言编写的程序可以互相通信。

生成代码
通过编译器工具把 IDL 文件转换为语言对应的静态库

编解码
从内存中表示到字节序列的转化称为编码,反之称为解码。

通信协议
规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据。

网络传输
通常基于成熟的网络库,走 TCP/UDP 传输 image.png

1.3 RPC 的好处

  1. 单一职责,有利于分工写作和运维开发
  2. 可扩展性强,资源使用率更优
  3. 故障隔离,服务的整体可靠性更高

2. RPC 框架的分层设计

2.1 整体框架

举例:Apache Thrift image.png

2.2 编解码层

  • 语言特定的格式:例如 Java 有 java.io.Serializable
  • 文本格式:例如 JSON、XML、CSV 等文本格式
  • 二进制编码:具备跨语言和高性能等优点
    • TLV 编码:Thrift 的 BinaryProtocol
    • Varint 编码:Protobuf image.png

2.3 协议层

  0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 4 5 6 7 8 9 a b c d e f
+----------------------------------------------------------------+
| 0|                          LENGTH                             |
+----------------------------------------------------------------+
| 0|       HEADER MAGIC          |            FLAGS              |
+----------------------------------------------------------------+
|                         SEQUENCE NUMBER                        |
+----------------------------------------------------------------+
| 0|     Header Size(/32)        | ...
+---------------------------------

                  Header is of variable size:
                   (and starts at offset 14)

+----------------------------------------------------------------+
|         PROTOCOL ID  (varint)  |   NUM TRANSFORMS (varint)     |
+----------------------------------------------------------------+
|      TRANSFORM 0 ID (varint)   |        TRANSFORM 0 DATA ...
+----------------------------------------------------------------+
|         ...                              ...                   |
+----------------------------------------------------------------+
|        INFO 0 ID (varint)      |       INFO 0  DATA ...
+----------------------------------------------------------------+
|         ...                              ...                   |
+----------------------------------------------------------------+
|                                                                |
|                              PAYLOAD                           |
|                                                                |
+----------------------------------------------------------------+

2.4 网络通信层 - Sockets API

image.png

3. RPC 框架的关键指标

3.1 稳定性

  • 保障策略:熔断、限流、超时控制
  • 请求成功率:负载均衡、重试
  • 长尾请求:Backup Request
  • 注册中间件

3.2 易用性

  • 开箱即用
    • 合理的默认参数选项,丰富的文档
  • 周边工具
    • 生成代码工具,脚手架工具

3.3 扩展性

image.png

3.4 观测性

  • Log 日志
  • Metric 监控
  • Tracing 链式跟踪
  • 内置观测性服务

3.5 高性能

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

4. 字节企业实践

4.1 整体框架 - Kitex

  • Kitex Core:核心组件
  • Kitex Byted:与公司内部基础设施集成
  • Kitex Tool:代码生成工具 image.png

4.2 自研网络库 - Netpoll

4.3 编解码优化

  • Codegen 自研了 GO 语言实现的 Thrift IDL 解析和代码生成器
  • JIT 即时编译技术 基于 JIT 编译技术的高性能动态 Thrift 编解码器 - Frugal

4.4 合并部署

将亲和性强的服务实例尽可能调度到同一个物理机,远程RPC调用优化为本地IPC调用。