设计RPC框架应考虑的问题

最近面试遇到一个很好的问题,面试官说如何设计一个RPC框架,虽然自己在Hadoop中会用到RPC,但是从来没总结过PRC框架的知识点,所以记录一下喽。

RPC作用

RPC作为分布式系统常见的一种通信方法,通俗来讲,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。

框架需解决问题

RPC要达到的目标:远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。

  • 1、Call ID映射,解决告诉远程主机我们要调用哪个函数;
    在本地调用中,我们可以通过函数指针指定函数体,调用具体函数,然后编译器就会帮我们调用相应的函数指针;但是在远程调用中,因为两个进程的地址空间不一样,所以无法通过调用函数指针调用函数。所以,在RPC中,所有函数必须有一个唯一的ID,在客户端和服务端分别维护一个 {函数 <–> Call ID} 的对应表。当客户端需要进行远程调用时,基于调用的函数查一下这个表,找出相应的Call ID,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
  • 2、序列化和反序列化,解决怎么把参数值传送给远程函数。
    在本地调用中,我们只需要把参数压到栈里,然后让函数自己去栈里读就行。但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。另外,有时候客户端和服务端使用的都不是同一种语言。
    这时候就需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。这个过程叫序列化和反序列化。同理,从服务端返回的值也需要序列化反序列化的过程。
  • 3、网络传输,解决数据的传输。
    网络传输层需要把Call ID和序列化后的参数字节流传给服务端,然后再把序列化后的调用结果传回客户端。网络传输可以使用TCP协议,保证可靠传输;也可以使用UDP,加快传输速度。
  • 4、服务注册中心,解决分布式架构中,一个服务势必会有多个实例,如何获取实例的问题。
    可以使用Zookeeper作为注册中心,在调用时,从Zookeeper获取服务的实例列表,再从中选择一个进行调用。
  • 5、redis缓存,如果每次都去注册中心查询列表,效率很低,那么就要加缓存。
  • 6、异步调用AIO,客户端总不能每次调用完都等着服务端返回数据,所以就要支持异步调用。
    AIO作为异步非阻塞,AIO发起IO操作之后,通知服务器去完成函数操作,这个时间客户端可以去做其他的事情。等到服务器完成操作之后,就会调用客户端的接口,返回结果数据。
  • 7、使用线程池
    针对高并发的客户端请求,服务端可以维护一个线程池,针对每次的客户端的请求,可以直接从线程池中拿出一个线程,直接去执行客户端的任务,省去了每次创建线程的开销,同时提高了服务端的响应速度。

你可能感兴趣的:(java,linux,hadoop)