RPC的优缺点,以及一些常见问题 | 青训营笔记

73 阅读3分钟
这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

RPC又叫远程函数调用,与之对应的是本地函数调用

那么RPC有哪些优点?
1、单一职责,有利于分工协作,不同的服务甚至可以采用不同的语言开发,运维上线都是独立的,可以由不同的团队进行维护

2、可扩展性强,对于一些流量较大的服务可以更方便的扩容,资源使用率更优,

3、故障隔离,某个服务出现故障的时候,不会导致整个服务崩溃,整体可靠性更高
RPC的模型概念:

User、User-Stub、RPC-Runtime、Server-Stub、Server

RPC(远程函数调用)相比本地函数调用有什么区别?

远程函数调用是部署在不同机器上的,中间隔着网络,所以自然会存在一些问题需要解决。

例如:服务A如何调用服务B的函数?

在本地函数调用中,是可以通过函数体指针来直接指定的,如果要调用那个方法,编译器会直接帮忙调用指针,但是远程调用中,在不同的服务器上,进程也不同,地址空间也不同,那么我们应该如何调用呢?

所以每个函数有一个自己的ID,做RPC调用的时候要带上这个ID,通过ID找到对应的函数,在去执行对应的功能。

服务A怎么把参数告诉服务B?

在本地函数调用通过压栈,再从栈内弹出来,而在远程函数调用中,不能通过内存来传递参数,所以就需要客户端转换成字节流再传输给服务端,服务端再把字节流转换成自己能读取的格式。

怎么保证服务之间高效的传输数据?

一次RPC完整的调用过程:

image.png

调用端先生成对应的代码,进行编码后采用对应的通信协议,并打包传输给被调用端,被调用端则是一个相反的过程,将数据解出来后传给上层进行处理。

相关基本概念:

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

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

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

通信协议:
规范数据在网络中的传输内容和格式,除必须的请求或者响应数据外,通常还会包含额外的元数据。

网络传输:
通常基于成熟的网络库,走TCP或UDP协议进行传输。

当然RPC也并不是十分完美,依然还会存在一些问题,例如:

1、服务宕机,对方应该如何处理?
2、在调用过程中发送网络异常,如果如何保证消息的可达性?
3、请求量突增导致服务无法及时处理,由哪些应对措施?