from: 字节跳动-内部课程(掘金)( bytedance.feishu.cn/file/boxcn5… )
author: June
created: 2023-08-01 14:52
tags: #course
0. 课程资料
- RPC的概念模型
- THeader 协议
- 字节内部 Kitex 实践分享
- 官方文档
- 字节跳动 Go RPC 框架 KiteX 性能优化实践_架构_字节跳动技术团队_InfoQ精选文章
- 字节跳动微服务架构体系演进_架构_字节跳动技术团队_InfoQ精选文章
1. 基本概念
-
本地函数调用 与 远程函数调用 (Remote Procedure Calling, RPC)
-
RPC 需要解决的问题
- 函数映射:eg. 怎么告诉支付服务需要调用付款函数,本地调用是通过函数指针,但是 RPC 中两个进程的地址空间是不同的,每个函数有自己的 ID,需要通过这个 ID 找到函数执行。
- 数据转换成字节流:eg. 本地调用中参数是压栈去读的,RPC 时不能直接通过内存读参,这里就需要字节流作为中间形式,客户端把参数转成字节流,服务端把字节流转为能读取的形式
- 网络传输:RPC 往往用在网络上,需要高速稳定的传输数据
-
RPC 概念模型
- User,User-stub,RPCRoutine,Server-stub,Server
- RPC 实际过程
- IDL (Interface description language)文件,接口描述语言文件,作为中立描述方式,不同平台和不同语言可以相互通信
- 生成代码:通过编译工具把 IDL 文件转换为语言对应的静态库
- 编解码:内存中表示->字节序列(称为编码),反之解码;也称为序列化和反序列化
- 通信协议:规范传输内容和格式,请求和响应数据+元数据
- 网络传输:基于成熟的网络库的 TCP/UDP 传输
-
RPC 的好处
- 单一职责,利于分工与协作
- 可扩展性强,资源使用率高
- 故障隔离,整体可靠性变高
-
RPC 带来的问题->需要设计个优雅的框架
- 服务宕机,如何处理
- 网络异常,消息如何可达
- 请求量突增,服务如何应对
2. 分层设计
- Apache Thrift 的分层设计 *
编解码层
- 编解码层不同的数据格式
- 语言特定格式: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,高性能定时器、对象池等
3. 关键指标
稳定性
- 保障策略
- 熔断
- 限流
- 超时控制
- 某种程度上讲,以上三种都是降级服务
- 请求成功率
- 负载均衡
- 重试:有放大故障的风险,防止重试风暴,限制单点重试和限制链路重试
- 长尾请求
- 一般是指明显高于均值的那部分占比较小的请求
- P99标准:99%的请求延迟要满足在一定耗时以内, 1%的请求会大于这个耗时, 而这1%就可以认为是长尾请求。
- 可能的原因:网络抖动,GC,系统调度
- 可能的方案:阈值重发
- 注册中间件
- Kitex Client 和 Server 的创建接]均采用 Option 模式,提供了极大的灵活性,很方便就能注入这些稳定性策略
易用性
- 开箱即用
- 周边工具
扩展性
- 多个 middleware 逐个执行
观测性
- Log, Metric, Tracing
- 内置观测服务:如环境变量、配置、参数、缓存信息等
高性能
- 高吞吐 与 低延迟
- 常用手段:连接池,多路复用,高性能编解码协议,高性能网络库