RPC 框架分层设计 | 青训营笔记

70 阅读2分钟

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

深入浅出 RPC 框架

RPC(远程过程调用)需要解决的三个主要问题:

  1. 函数映射:在远程调用中,函数的映射不能通过函数指针实现,因为两个进程的地址空间是不同的。
  2. 数据转换:远程调用中,数据需要被转换为字节流,以便在网络传输中传达。
  3. 网络传输:数据在网络中传输,需要处理网络故障和延迟等问题。

如何通知支付服务调用支付(pay)函数而不是退款(refund)或充值(recharge)函数? 在本地调用中,函数的选择是通过函数指针直接指定的,但是在远程调用中,函数指针是不适用的。每个函数都有一个独特的 ID,在进行 RPC 时,需要提供该 ID,并通过 ID 与函数的对应关系表找到相应的函数并执行。

在远程函数调用中,客户端与服务端是不同的进程,因此不能直接通过内存来传递参数。为了解决这个问题,客户端需要先把参数转成字节流,再将字节流发送到服务端,服务端接收后再将字节流转换为可读的格式。

为了使双方了解对方有哪些函数以及每个函数的参数格式,需要使用IDL(接口定义语言)文件来描述这些信息。双方都应该依赖同一份IDL文件,并使用工具生成相应的代码,用户代码需要依赖生成的代码来完成远程调用。

刚才我们提到服务双方是通过约定的规范进行远程调用,双方都依赖同一份IDL文件,需要通过工具来生成对应的生成文件,具体调用的时候用户代码需要依赖生成代码,所以可以把用户代码和生成代码看做一个整体。

编码只是解决了跨语言的数据交换格式,但是如何通讯呢?需要制定通讯协议,以及数据如何传输?我的网络模型如何呢?那就是这里的 transfer 要做的事情。

RPC 的好处

单一职责,开发(采用不同的语言)、部署以及运维(上线独立)都是独立的

可扩展性强,例如压力过大的时候可以独立扩充资源,底层基础服务可以复用,节省资源

某个模块发生故障,不会影响整体的可靠性

RPC 带来的问题

服务器宕机,对方应该如何处理?

在调用过程中发送网络异常,如何保证消息的可达性?

请求量突增导致服务无法及时处理,该怎么做?