RPC

43 阅读2分钟

rpc需解决的问题

  • 函数映射(远程函数调用)
  • 数据转换成字节流
  • 网络传输

一次RPC过程

IDL

用过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信

生成代码

通过编译器工具把IDL文件转换成语言对应的静态库

编解码

从内存中表示到字节序列的转换称为编码,反之解码

通信协议

规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,还包含额外的元数据

网络传输

通常基于成熟的网络库走TCP/UDP传输

好处

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

分层设计

编解码层

生成代码

客户端和服务端依赖同一份idl文件

数据格式

  • 语言特定的格式
  • 文本格式
    • JSON、SML、CSV等文本格式,具有可读性
  • 二进制编码
    • 具备跨语言和高性能等优点,BinaryProtocol,Protobuf

选型

  • 兼容性
    • 支持自动增加新的字段,而不影响老的服务
  • 通用性
    • 支持跨平台、跨语言
  • 性能
    • 从空间和时间两个维度考虑

协议层

概念

特殊结束符

一个特殊字符作为每个协议单元结束的标志如\r\n

变长协议

以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度

网络通信层-Socket API

网络库

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

rpc指标

稳定性

  • 熔断:保护调用方,防止被调用的服务出现问题而影响整个链路
  • 限流:保护被调用方,防止大流量把服务压垮
  • 超时控制:避免浪费资源在不可用节点上
  • 请求成功率
    • 负载均衡
    • 重试
  • 长尾请求(响应时间明显长于平均响应时间的请求)
  • 注册中间件
    • 超时、熔断、重试、限流、负载均衡、BackupRequest

易用性

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

扩展性

观测性

  • Log、Mertic(监控)、Tracing(链路跟踪)
  • 内置观测性服务

性能

  • 高吞吐
  • 低延迟

手段

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