RPC远程过程调用技术手记
Posted 谈玄论道白中堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RPC远程过程调用技术手记相关的知识,希望对你有一定的参考价值。
1. RPC的理解
RPC(Remote Procedure Call 远程过程调用):通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术细节。
“不需要了解底层网络细节”怎么理解呢?
(1) 客户端不需要了解网络协议和网络IO模型
不需要关心传输层使用的是TCP、UDP还是http协议,网络IO模型是同步(阻塞、非阻塞、IO多路复用)还是异步(如AIO)
(2) 客户端不需要了解信息格式
远程调用需要以某种信息格式传递一些参数到远程计算机。这些信息格式是怎样的调用方不需要关心
(3) 最好具备跨语言能力
无论服务器方使用什么语言,本次调用都应该成功。
2. RPC的组成部分
Nelson的论文中指出RPC的程序有5大组成部分。
(1) User(Client)
服务调用方
(2) User Stub(proxy)
负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的RPC Runtime实例传输到远端的实例。
为了客户端对RPC框架透明,需要stub来管理消息格式、网络传输协议、判断调用过程是否有异常。
(3) RPC Runtime(网络传输协议)
传输协议层负责管理RPC框架所使用的网络协议、网络IO模型
(4) Server Stub(Selector/Processor)
管理RPC接口的注册、判断客户端的请求权限、控制接口实现类的执行等
(5) Server
服务的真正提供者,它的代码是最普通的和业务相关的代码,甚至接口实现类本身都不知道将被某一个RPC远程客户端调用。
如果考虑到跨语言能力,还需要IDL(接口定义语言)部分,定义一个各种语言能够理解的消息结构、接口定义的描述形式
现今正火的两大技术领域云和大数据底层也都离不开RPC技术的支持。
3. Spark中的RPC
spark中的rpc框架承担了各服务之间的信息交流。Sparkrpc是spark中对分布式通信系统的高度抽象。SparkRPC最为重要的三个抽象为:RpcEndpointRef、RpcEnv、RpcEndpoint。RpcEndpointRef发送消息给RpcEnv,RpcEnv查询注册消息将消息路由到指定的RpcEndpoint,RpcEndpoint接收到消息后进行处理。
传输层选择TCP协议;I/O Model采用Netty,使用底层的I/O多路复用(I/O Multiplexing)机制,可通过spark.rpc.io.mode参数设置;线程模型采用Multi-Reactors + mailbox的异步方式来处理;SchemaDeclaration和序列化,默认采用Java native serialization方案,从兼容性和JVM平台内部组件通信,以及scala语言的融合考虑,不具备跨语言通信的能力,性能上也不是追求极致。
(1) Rpc客户端发送消息
(2) Rpc客户端接收消息
(3) Rpc服务端处理请求
(4) Rpc服务端发送响应
4. OpenStack中的RPC
openstack中同项目内(如 nova,neutron,cinder…)各服务(service)及通过RPC实现彼此间通信。
(1) 以nova组件通信机制为例,标有AMPQ字样的表示两端是通过RPC通信的。
(2) openstack中有两种比较经典的rpc调用方式:rpc.call()和rpc.cast。社区为了简化rpc的调用,用oslo_messaging进行了一系列封装,供组件调用。
Rpc.call()是一种同步调用的方式
Rpc.cast()是一种异步调用的方式
(3) 在openstack中还可以用RPC来实现分布式任务调度管理
一个分布式系统包括多个client端(可能有多个)和workers。
Client上运行一个flow,当client启动一个新的Task时,会向workers发送rpc calls,这个call会携带endpoint信息以及和Task相关的参数;
workers中的一个接收到这个消息后会向client发送确认消息,执行相关的方法,并定期向client发送心跳;
client在此期间会一直监听worker的response,当task完成后,worker向client发送执行结果;
如果在限定时间内client没有收到worker的心跳,那么client就会认为worker的执行时失败的。
以上是关于RPC远程过程调用技术手记的主要内容,如果未能解决你的问题,请参考以下文章
2016-04-25-信息系统实践手记6-JS调用Flex的性能问题一例