这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
一、本堂课重点内容
- 基本概念
- 分层设计
- 关键指标
- 企业实践
二、 详细知识点介绍
RPC 相关的基本概念
1.定义
RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。 它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。
2.开发原动机
- 简单:RPC 概念的语义十分清晰和简单,这样建立分布式计算就更容易。
- 高效:过程调用看起来十分简单而且高效。
- 通用:在单机计算中「过程」往往是不同算法部分间最重要的通信机制。
3.RPC需要解决的问题
- 函数映射
- 数据流转换成字节流
- 网络传输
4.一次RPC的完整过程
-
IDL(Interface description language)文件:描述接口
-
生成代码:编译器把IDL文件转换成语言对应的静态库
-
编解码:内存中表示到字节序列的转换称为编码,反之为解码,常叫做序列化和反序列化
-
通信协议:规范了数据在网络中的传输内容和格式
-
网络传输:基于成熟的网络库走TCP/UDP传输
5.分类
RPC 调用分以下两种:
- 同步调用:客户端等待调用执行完成并获取到执行结果。
- 异步调用:客户端调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。若客户端不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。
异步和同步的区分在于是否等待服务端执行完成并返回结果。
RPC 框架的分层设计
1.一个最简单的RPC框架分成三个部分:注册中心、服务端、客户端。
2.如何跨编程语言调用
3.网络通信
- √提供易用API
- 封装底层Socket API连接管理和事件分发
- √功能
- 协议支持: tcp、udp 和uds等
- 优雅退出、异常处理等
- √性能
- 应用层 buffer 减少copy高性能定时器、对象池等
4.RPC的好处
- 单一职责,有利于分工协作和运维开发
- 可扩展性强,资源使用率更优
- 故障隔离:服务整体可靠性更高
问题:
- 服务宕机
- 网络异常
- 请求量突增
关键指标
稳定性
1.保障策略
- 熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路
- 限流:保护被调用方,防止大流量把服务压垮
- 超时控制:避免浪费资源在不可用节点上
2.请求成功率
负载均衡
重试:防止重试风暴,限制单点重试和链路重试
3.长尾请求
明显高于均值的那部分占比较小的请求
4.备份请求
设定一个阈值时间t3(通常为pct99),当req1发出后超过t3时间未返回就发送req2,这样相当于同时有两个请求运行,只要resp1或resp2任意一个返回即结束请求
5.注册中间件
易用性
- 开箱即用
- 合理的默认参数选项、丰富的文档
- 周边工具
- 生成代码工具、脚手架工具
扩展性
- Middleware
- Option
- 编解码层
- 协议层
- 网络传输层
- 代码生成工具插件扩展
可观测性
log、metric、tracing
内置观测性服务
高性能
目标:
- 高吞吐
- 低延迟
手段:
- 连接池
- 多路复用
- 高性能编码协议
- 高性能网络库
企业实践
- 整体架构
- 自研网络库
- 扩展性设计
- 性能优化
- 合并部署
整体架构
Kitex Core核心组件
Kitex Byted集成内部基础设施
Kitex Tool代码生成工具
自研网络库—Netpoll
- 原生库无法感知连接状态
- 原生库存在goroutine暴涨的风险
- 提升性能
扩展性设计
支持多协议,也支持灵活的自定义协议扩展
性能优化
网络库
- 调度优化
- LinkBuffer
- Pool
编解码
Codegen
JIT
合并部署
新的微服务形态
微服务过微,传输和序列化开销越来越大
将亲和性强的服务实例尽可能调度到同一物理机,远程RPC调用优化为本地IPC调用
- 中心化的部署调度和流量控制
- 基于共享内存的通信协议
- 定制化的服务发现和连接池实现
- 定制化的服务启动和监听逻辑
三、课后
- 行业内各个流行的 RPC 框架的优劣对比
- 从第三章节 RPC 的核心指标来看,Kitex 还有哪些功能是欠缺或者需要加强的?
- 了解微服务的新趋势 ServiceMesh,以及 RPC 框架和 ServiceMesh 的关系
- 关于 RPC 框架,业界有哪些新的趋势和概念?
- Netpoll 的优势在哪?相比其他高性能网络库例如 Netty 还有什么不足?
-
Flatbuffer 和 Cap'n Proto 等编解码协议为什么高性能?