RPC基础
概念
RPC(Remote Procedure Call)是一种远程过程调用的协议和模式,用于在计算机网络中实现分布式系统中不同节点之间的通信和协作。
在RPC中,客户端应用程序可以像调用本地函数一样调用远程服务器上的函数或方法,而无需关注网络细节和通信协议。RPC隐藏了底层的网络通信细节,使得分布式系统中的不同节点可以透明地进行函数调用和数据交换。
框架设计
分为三个部分:通信框架、通信协议、序列化和反序列化格式
RPC框架
跨语言的开源RPC框架主要有Thrift和gRPC
框架对比
gRPC特点
- 编程语言只支持C++、Java和Go
- 通信协议使用HTTP/2,默认支持异步通信和流式传输(也可以用非流式调用,也就是 unary call)
- 序列化格式默认使用Protocol Buffers(也可以配置成JSON)
- 不需要处理如何将 RPC 概念映射到 HTTP 协议上
- 有许多良好的文档和示例
Thrift特点
- 多种编程语言支持
- 支持多种通信协议(协议层、传输层上的多种协议)
- 支持多种序列化格式
- 早期版本中对异步支持不够完善,但在较新的版本中也提供了异步功能
基准测试结果
- 对于长连接,QPS 没有太大差异,gRPC 更好,延迟更小,Thrift 更好,CPU 使用率更少
- 对于短连接,Thrift(TCP) 在 QPS/CPU/Lantency 方面优于 gRPC(HTTP2)
- 由于工作模式(每个连接一个goroutine),对于短连接,随着连接数的增加,CPU占用率明显增加,连接限制非常重要,如果出现如下错误
gRPC: addrConn.resetTransport 无法创建客户端传输:连接错误:desc =“传输:拨号 tcp:getsockopt:连接被拒绝”
- 一小部分连接的延迟无法控制,因为 Go 的 GC 会导致世界停止,对于延迟要求非常严格的实时应用,使用 C/C++ 或 Rust 而不是 Go