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

59 阅读2分钟

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

RPC 需要解决的问题

  1. 函数映射
  2. 数据转换成字节流(可以跨语言)
  3. 网络传输

好处:

  1. 利于分工合作
  2. 扩展性强
  3. 故障隔离 问题:
  4. 服务宕机如何处理
  5. 网络异常如何保证消息可达
  6. 请求量突增无法及时处理,如何应对

分层设计

  1. 编解码层
  2. 协议层
  3. 网络层

掌握:选层的关键是什么,以及这一层的核心架构是怎样的。

稳定性

  1. 熔断:保护调用方
  2. 限流:保护被调用方
  3. 超时控制:避免浪费资源在不可用节点上

请求成功率

  1. 负载均衡
  2. 重试

长尾请求

比如请求时间排序,99%的位置,剩下的 1%就是长尾请求 如果请求超过这个长尾时间 t3 就直接重试

注册中间件

通过中间件增加稳定性 how?

  • 负载均衡、熔断等都是中间件实现的

高性能

目标

  1. 高吞吐
  2. 低延迟

场景

  1. 单机多机
  2. 单连接,多连接
  3. 单/多 Client, 单/多 Server
  4. 不同请求包大小
  5. 不同请求类型

手段

  1. 连接池
  2. 多路复用
  3. 高性能解码协议
  4. 高性能网络库

实践

自研网络库背景

  1. 原生库无法感知链接池状态(池中存在失效连接,影响复用效果)
  2. 原生库存在 goroutine 暴涨风险

Netpoll

  1. 引入 epoll 监听,感知链接状态
  2. 建立 goroutine 池,复用 goroutine
  3. 引入 Nocopy buf,零拷贝

调度优化

epoll_wait 在调度上的控制 LinkBuffer:并写无锁读写, nocpoy 流式输出

合并部署

微服务过微,传输和序列化开销大 亲和性强的服务实例,调度到同一个机器,远程 RPC 变成本地 IPC 调用

PPT

  1. 字节跳动 Go RPC 框架 KiteX 性能优化实践_架构_字节跳动技术团队_InfoQ精选文章
  2. 字节跳动微服务架构体系演进_架构_字节跳动技术团队_InfoQ精选文章