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

41 阅读3分钟

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

RPC原理与实现

一、本堂课重点内容:

本堂课的知识要点有哪些?

  • RPC 相关的基本概念
  • RPC 框架的分层设计
  • 衡量 RPC 框架的一些核心指标
  • 字节内部 RPC 框架 Kitex 实践分享

二、详细知识点介绍:

本堂课介绍了哪些知识点?

  • RPC 相关的基本概念
    • RPC的概念模型:User、User-Stub、RPC-Runtime、Server-Stub、Server

    • 来自论文《Implementing Remote Procedure Calls

    • IDL(Interface Definition Language) 文件

      • Thrift
      • Protobuf
    • 生成代码

    • 编解码(序列化/反序列化)

    • 通信协议

      • 应用层协议
    • 网络通信

      • IO 网络模型
        • blocking IO
        • unblocking IO
        • IO multiplexing
        • signal driven IO
        • asynchronous IO
      • 传输层协议
        • TCP
        • UDP
  • RPC 框架的分层设计
    • 编解码层
      • 数据格式:
        • 语言特定格式
        • 文本格式
        • 二进制编码
          • TLV 编码:Thrift 使用 TLV 编码
          • Varint 编码:Protobuf 使用 Varint 编码
      • 选项:
        • 兼容性
        • 通用型
        • 性能
    • 传输协议层
      • 消息切分
        • 特殊结束符
        • 变长协议:length+body
      • 协议构造
        • 以 Thrift 的 THeader 协议为例讲解
    • 网络通信层
      • 网络库
      • 核心指标
        • 吞吐高
        • 延迟低
  • 衡量 RPC 框架的一些核心指标
    • 稳定性
    • 保障策略
      • 熔断
      • 限流
      • 超时
    • 请求成功率
      • 负载均衡
      • 重试
    • 长尾请求
      • BackupRequest
  • 易用性
    • 开箱即用
    • 周边工具
  • 扩展性
  • 观测性
    • Log
    • Metric
    • Tracing
    • 内置观测性服务
  • 高性能
  • 字节内部 RPC 框架 Kitex 实践分享
  • 合并部署

三、实践练习例子:

有什么实践举例帮助理解知识点?

  • 字节内部的Kitex实践

    • 框架文档 Kitex
  • 自研网络库 Netpoll,背景:

    • a. 原生库无法感知连接状态
    • b. 原生库存在 goroutine 暴涨的风险
  • 扩展性:支持多协议,也支持灵活的自定义协议扩展

  • 性能优化,参考 字节跳动 Go RPC 框架 KiteX 性能优化实践

  • a. 网络优化

    • i. 调度优化
    • ii. LinkBuffer 减少内存拷贝,从而减少 GC
    • iii. 引入内存池和对象池
  • b. 编解码优化

    • i. Codegen:预计算提前分配内存,inline,SIMD等
    • ii. JIT:无生产代码,将编译过程移到了程序的加载(或首次解析)阶段,可以一次性编译生成对应的 codec 并高效执行
  • 合并部署

    • a. 微服务过微,引入的额外的传输和序列化开销越来越大
    • b. 将强依赖的服务统计部署,有效减少资源消耗

四、课后个人总结:

本章有什么知识点不容易掌握?

  1. 本地函数调用和RPC调用的区别:函数映射、数据转成字节流、网络传输
  2. RPC的概念模型:User、User-Stub、RPC-Runtime、Server-Stub、Server
  3. 一次PRC的完整过程,并讲解了RPC的基本概念定义
  4. RPC带来好处的同时也带来了不少新的问题,将由RPC框架来解决

什么地方容易与其他内容混淆?

五、引用参考:

  • 我参考了哪些外部博客/笔记/文章?
  • 文章中有什么地方是我参考引用了外部博客/笔记/文章的