RPC 框架 | 青训营笔记

48 阅读3分钟

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

  RPC(Remote Procedure Calls,远程过程调用)指调用非本地的设备上执行函数。RPC 由 User、User-Stub、RPC-Runtime、Server-Stub 和 Server 五部分组成。

  完整的 RPC 开发执行过程包括编写 IDL 文件、生成代码、编解码、根据通信协议创建连接、网络传输五部分。

  相比于本地调用,RPC 具有单一职责、可扩展性强和故障隔离等优点,但也面临服务端宕机、网络连接波动等问题。

分层设计

  调用端与被调用端的分层结构是对称的,分为业务逻辑层、编解码层、协议层和网络通信层。

  编解码层用于将函数调用参数和返回值等编解码以便传输。Thrift 的 BinaryProtocol 采用 TLV 的编码格式,即 Tag、Length 和 Value。该格式兼容性好但引入了部分与原数据无关的数据。

  选择编解码格式要考虑该格式的兼容性(便于业务扩展)、通用性(多种平台都可使用)和性能。

  协议搞定了双方通信的数据格式,可分为特殊结束符(使用特殊结束符分割数据,无需引入元数据,如 HTTP 协议的\r\n)和变长协议(使用定长部分描述变长部分的长度、类型等)两种。

  网络通信层使用 Socket API 进行通信,位于 TCP/IP之上。

评估指标

  评估一个 RPC 框架的质量主要在于其稳定性、易用性、扩展性、观测性和高校性。

稳定性

  为了保证服务的稳定运行,需要添加熔断(保护调用方,尽可能维持正常调用)、限流(保护被调用方不因压力过大宕机)和超时控制(保证这整个系统不会在故障节点上浪费大量时间)的功能。在迫不得已的情况下,还要对非重要业务进行降级。

  衡量稳定性的一个重要指标是请求成功率,为了保证请求成功率在一个较高水平,可以通过负载均衡和部分重试来实现。对于长尾请求(连续多次 RPC 调用),应对重试加以限制,同时通过备份请求提高成功率。

  上述操作通常采用注册中间件的方式提供。

易用性

  易用性体现在文档的丰富程度、默认配置的适应能力、辅助工具的质量等。

扩展性

  扩展性体现在各个分层的扩展能力和辅助工具的廓形含能力。

观测性

  观测型体现在 Log、Metric、Tracing 的质量与内置观测性服务。

高性能

  高性能的评判体现在高吞吐和低延迟两个维度,常用优化手段有使用连接池、多路复用以及使用高性能的编解码协议和高性能网络库。

本文若有不足之处,欢迎纠正(≧^.^≦)喵~

我的其他笔记,可在掘金或 Github( github.com/DoudiNCer/I… )阅读