RPC 原理与实践|青训营笔记

70 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

一、本堂课重点内容

  • 基本概念
  • 分层设计
  • 关键指标
  • 企业实践

二、 详细知识点介绍

RPC 相关的基本概念

1.定义

RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。 它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。

2.开发原动机

  • 简单:RPC 概念的语义十分清晰和简单,这样建立分布式计算就更容易。
  • 高效:过程调用看起来十分简单而且高效。
  • 通用:在单机计算中「过程」往往是不同算法部分间最重要的通信机制。

3.RPC需要解决的问题

  • 函数映射
  • 数据流转换成字节流
  • 网络传输

4.一次RPC的完整过程

  • IDL(Interface description language)文件:描述接口

  • 生成代码:编译器把IDL文件转换成语言对应的静态库

  • 编解码:内存中表示到字节序列的转换称为编码,反之为解码,常叫做序列化和反序列化

  • 通信协议:规范了数据在网络中的传输内容和格式

  • 网络传输:基于成熟的网络库走TCP/UDP传输

image.png

5.分类

RPC 调用分以下两种:

  1. 同步调用:客户端等待调用执行完成并获取到执行结果。
  2. 异步调用:客户端调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。若客户端不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。

异步和同步的区分在于是否等待服务端执行完成并返回结果。

RPC 框架的分层设计

1.一个最简单的RPC框架分成三个部分:注册中心、服务端、客户端。

image.png

2.如何跨编程语言调用

image.png

3.网络通信

  • √提供易用API
    • 封装底层Socket API连接管理和事件分发
  • √功能
    • 协议支持: tcp、udp 和uds等
    • 优雅退出、异常处理等
  • √性能
    • 应用层 buffer 减少copy高性能定时器、对象池等

4.RPC的好处

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

问题:

  • 服务宕机
  • 网络异常
  • 请求量突增

关键指标

稳定性

1.保障策略

  • 熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路
  • 限流:保护被调用方,防止大流量把服务压垮
  • 超时控制:避免浪费资源在不可用节点上

2.请求成功率

负载均衡

重试:防止重试风暴,限制单点重试和链路重试

3.长尾请求

明显高于均值的那部分占比较小的请求

4.备份请求

设定一个阈值时间t3(通常为pct99),当req1发出后超过t3时间未返回就发送req2,这样相当于同时有两个请求运行,只要resp1或resp2任意一个返回即结束请求

5.注册中间件

image.png

易用性

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

扩展性

  • Middleware
  • Option
  • 编解码层
  • 协议层
  • 网络传输层
  • 代码生成工具插件扩展

可观测性

log、metric、tracing

内置观测性服务

高性能

目标:

  • 高吞吐
  • 低延迟

手段:

  • 连接池
  • 多路复用
  • 高性能编码协议
  • 高性能网络库

企业实践

  • 整体架构
  • 自研网络库
  • 扩展性设计
  • 性能优化
  • 合并部署

整体架构

Kitex Core核心组件

Kitex Byted集成内部基础设施

Kitex Tool代码生成工具

自研网络库—Netpoll

  • 原生库无法感知连接状态
  • 原生库存在goroutine暴涨的风险
  • 提升性能

扩展性设计

支持多协议,也支持灵活的自定义协议扩展

性能优化

网络库

  • 调度优化
  • LinkBuffer
  • Pool

编解码

Codegen

JIT

合并部署

新的微服务形态

微服务过微,传输和序列化开销越来越大

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

  • 中心化的部署调度和流量控制
  • 基于共享内存的通信协议
  • 定制化的服务发现和连接池实现
  • 定制化的服务启动和监听逻辑

三、课后

  1. 行业内各个流行的 RPC 框架的优劣对比
  1. 从第三章节 RPC 的核心指标来看,Kitex 还有哪些功能是欠缺或者需要加强的?
  1. 了解微服务的新趋势 ServiceMesh,以及 RPC 框架和 ServiceMesh 的关系
  1. 关于 RPC 框架,业界有哪些新的趋势和概念?
  1. Netpoll 的优势在哪?相比其他高性能网络库例如 Netty 还有什么不足?
  1. Flatbuffer 和 Cap'n Proto 等编解码协议为什么高性能?