这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记
RPC
需要解决以下问题:
- 函数映射
- 数据转换为字节流(序列化)
- 网络传输
对于 RPC 带来的问题,需要通过 RPC 框架解决
分层设计
基本的RPC框架设计分为以下几层:
- Client/Serve
- Encode/Decode
- Protocol
- Transport
编码解码层
-
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
-