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

63 阅读2分钟

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

目录

  • 基本概念
  • 分层设计
  • 关键指标

基本概念

本地函数调用

func sayhello() {
   fmt.Println("hello")
}
func main() {
   sayhello()
}

远程函数调用(RPC - Remote Procedure Calls)

image.png

RPC 需要解决的问题

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

####一次完整的RPC过程

  • IDL:通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信
  • 生成代码: 通过编译器工具把IDL文件转换成语言对应的静态库
  • 编解码: 从内存中表示到字节序列的转换成为编码,反之则是解码,也叫序列化和反序列化
  • 通信协议:规范了数据在网络中的传输内容和格式,除必须的请求和响应数据外,通常还会包含额外的元数据
  • 网络传输:基于成熟的网络库走TCP/UDP传输

image.png

RPC的好处

  • 单一职责
  • 可扩展性强
  • 故障隔离

RPC带来的问题

  • 服务宕机,对方应该怎么处理
  • 网络异常如何保证消息的可达性
  • 请求量突增导致服务无法及时处理,怎么应对

分层设计

以 Apache Thrift 为例子

image.png

image.png

关键指标

  • 稳定性
    • 保障策略
      • 熔断:保护被调用的服务出问题而影响整个链路
      • 限流:防止大流量把服务压垮
      • 超时控制: 避免浪费资源在不可用节点上
    • 请求成功率
      • 负载均衡
      • 重试
    • 长尾巴请求
      • Backup Request
    • 注册中间件
  • 易用性
    • 开箱即用
    • 周边工具
  • 扩展性
    • Middleware
    • Option
    • 编解码层
    • 协议层
    • 网络传输层
    • 代码生成工具插件扩展
  • 观测性
    • Log、 Metric、Tracing
    • 内置观测性服务
  • 高性能
    • 场景
      • 单机多机
      • 单连接多连接
      • 不同大小的请求包
      • 不同的请求类型
    • 目标
      • 高吞吐
      • 低延迟
    • 手段
      • 连接池
      • 多路复用
      • 高性能编解码协议
      • 高性能网络库