RPC 基本概念
完整的RPC过程
IDL (Interface description language)
文件IDL 通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信
生成代码
通过编译器工具把 IDL 文件转换成语言对应的静态库
编解码
从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化
通信协议
规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据
网络传输
通常基于成熟的网络库走 TCP/UDP 传输
RPC 的优点
- 单一职责,有利于分工协作和运维开发。
- 可扩展性强,资源使用率更优。
- 故障隔离,服务的整体可靠性更高。
RPC 在日常生活中的体现:
- 快速响应的网络应用:许多日常使用的网络应用,如社交媒体、在线购物、音乐和视频流媒体等,都依赖于后端的分布式系统。RPC可以加快不同服务之间的通信速度,使得这些应用能够快速响应用户请求,提供流畅的用户体验。
- 移动应用的数据同步:许多移动应用需要与后端服务器进行数据同步,包括获取用户信息、发送和接收消息、获取最新的新闻和信息等。RPC可以帮助移动应用与后端服务器进行高效的通信,确保数据的及时更新和同步。
- 云服务的弹性和扩展性:云计算平台和服务提供商使用RPC来搭建可弹性扩展的基础设施。通过RPC,不同的服务可以动态地调用和协调资源,实现自动化的扩展和负载均衡,以满足不同规模和需求的应用程序。
- 实时通信和协作工具:实时通信和协作工具,如即时通讯应用、在线会议工具、团队协作平台等,需要在分布式环境中进行实时的消息传递和数据同步。RPC可以提供高效的消息传递机制,确保实时通信和协作的顺畅运行。
RPC 带来的问题
- 服务宕机,对方应该如何处理?
- 在调试过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
基于以上问题,便引出了RPC框架来解决
RPC框架
RPC框架采用分层设计,分为编解码层,协议层,网络通信层三层
编解码层
- 序列化和反序列化:编解码层使用序列化和反序列化技术将数据从对象的内存表示形式转换为字节流,在网络传输中进行传输,然后再将字节流还原为对象。常见的序列化格式包括JSON、XML、Protocol Buffers、Thrift等。序列化和反序列化的过程需要考虑数据结构、字段类型、版本兼容性等因素。
- 数据结构定义:编解码层需要根据约定的数据结构定义,将数据转换为特定的格式。这些定义可以是接口定义语言(IDL)文件、协议定义文件或类似的规范。数据结构定义包括定义消息、请求和响应的字段、数据类型、枚举等。
- 数据压缩:为了减少网络传输的数据量和提高性能,编解码层可以使用数据压缩技术。压缩可以在序列化之前或之后进行,常见的压缩算法包括Gzip、Snappy、LZ4等。
- 多语言支持:RPC框架编解码层需要支持多种编程语言,使得不同语言编写的程序可以相互通信。这意味着编解码层需要提供相应的序列化和反序列化库或工具,以便在不同语言之间进行数据转换。
协议层
- 通信协议:协议层定义了在RPC通信中使用的底层通信协议,例如TCP、UDP、HTTP等。不同的协议具有不同的特点和适用场景,例如TCP提供可靠的连接,而UDP则提供了更低的延迟。
- 请求-响应模型:协议层定义了请求-响应模型,即客户端发送请求,服务端接收请求并返回响应。这包括定义请求和响应的格式、头部信息、错误码等。
- 连接管理:协议层负责管理客户端和服务端之间的连接。它定义了连接的建立、断开、保持和重用机制,以确保有效的通信和资源利用。
- 服务发现和注册:协议层可以支持服务发现和注册机制,使客户端能够发现可用的服务实例和服务接口。这可以通过在协议层中定义服务注册中心、服务注册和发现协议等来实现。
- 序列化协议:协议层定义了在数据传输过程中所使用的序列化协议。常见的序列化协议包括JSON、XML、Protocol Buffers、Thrift等。协议层需要确保序列化和反序列化的一致性,以便不同系统可以正确解析和处理数据。
- 安全性和认证:协议层可以支持安全性和认证机制,以保护通信的机密性和完整性。这可以包括使用TLS/SSL进行加密通信、身份认证、访问控制等。
- 故障处理和容错机制:协议层需要处理通信中的故障和异常情况,例如网络断开、超时、连接失败等。它可以定义故障检测、重试机制、容错策略等,以提高系统的可靠性和稳定性。
网络通信层
- 客户端和服务端的连接:网络通信层负责建立客户端和服务端之间的连接。它可以使用底层的网络协议(如TCP、UDP)来建立可靠的连接或无连接的连接。
- 数据传输:网络通信层负责将数据在客户端和服务端之间进行传输。它将RPC请求和响应等数据打包成网络报文,并通过底层的网络协议进行传输。
- 序列化和反序列化:网络通信层使用序列化和反序列化技术将数据从对象的内存表示形式转换为字节流,以便在网络上传输。它在发送数据之前对数据进行序列化,并在接收数据之后对数据进行反序列化。
- 消息编码和解码:网络通信层负责将消息进行编码和解码。编码将消息转换为二进制形式以便传输,而解码将接收到的二进制数据转换回消息格式。
- 连接管理和连接池:网络通信层管理客户端和服务端之间的连接。它可以维护连接池来重用连接,减少连接建立和断开的开销,提高性能和效率。
- 超时和重试机制:网络通信层可以实现超时和重试机制,以处理网络故障、连接超时等异常情况。超时机制可确保在一定时间内完成通信操作,而重试机制可尝试重新发送请求以应对传输失败。
- 错误处理和日志记录:网络通信层需要处理通信过程中的错误和异常情况,并记录日志以进行故障排查和监控。
RPC 的关键指标
在RPC系统中,有一些关键指标可以用于分析和评估系统的性能和效率。以下是一些常见的RPC关键指标:
- 延迟(Latency):延迟是指从发送RPC请求到接收到相应的时间间隔。较低的延迟表示系统响应速度更快,对于实时性要求较高的应用尤为重要。
- 吞吐量(Throughput):吞吐量表示单位时间内处理的RPC请求数量。高吞吐量表示系统能够处理更多的请求,对于高并发场景和大规模应用非常关键。
- 并发性(Concurrency):并发性指系统能够同时处理的并发请求数量。较高的并发性表示系统能够同时处理更多的请求,提高系统的并发处理能力。
- 错误率(Error Rate):错误率表示RPC请求中出现错误的比例。较低的错误率表示系统的稳定性和可靠性较高,对于关键业务应用尤为重要。
- 资源利用率(Resource Utilization):资源利用率表示系统在处理RPC请求时所使用的资源(如CPU、内存、网络带宽)的利用程度。高资源利用率表示系统能够充分利用资源,提高系统的效率和性能。
- 容量规划(Capacity Planning):容量规划是指根据系统的负载和性能需求,预测和规划系统所需的资源容量。通过对RPC系统的负载和性能指标进行分析,可以确定系统的容量需求和扩展计划。
- 故障率(Failure Rate):故障率表示系统在处理RPC请求时出现故障或错误的频率。低故障率表示系统的稳定性较高,能够提供可靠的服务。
- 网络带宽(Network Bandwidth):网络带宽表示RPC请求在网络传输中所占用的带宽。高网络带宽要求可能会对系统的网络性能和可扩展性提出挑战。