RPC远程过程调用技术手记

Posted 谈玄论道白中堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RPC远程过程调用技术手记相关的知识,希望对你有一定的参考价值。

1.    RPC的理解

RPC(Remote Procedure Call 远程过程调用):通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术细节。

“不需要了解底层网络细节”怎么理解呢?

(1)   客户端不需要了解网络协议和网络IO模型

不需要关心传输层使用的是TCP、UDP还是http协议,网络IO模型是同步(阻塞、非阻塞、IO多路复用)还是异步(如AIO)

(2)   客户端不需要了解信息格式

远程调用需要以某种信息格式传递一些参数到远程计算机。这些信息格式是怎样的调用方不需要关心

(3)   最好具备跨语言能力

无论服务器方使用什么语言,本次调用都应该成功。

RPC远程过程调用技术手记


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远程客户端调用。

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客户端发送消息

RPC远程过程调用技术手记

(2)   Rpc客户端接收消息

RPC远程过程调用技术手记

(3)   Rpc服务端处理请求

RPC远程过程调用技术手记

(4)   Rpc服务端发送响应

RPC远程过程调用技术手记


4.    OpenStack中的RPC


openstack中同项目内(如 nova,neutron,cinder…)各服务(service)及通过RPC实现彼此间通信。

(1)   以nova组件通信机制为例,标有AMPQ字样的表示两端是通过RPC通信的。

RPC远程过程调用技术手记

(2)   openstack中有两种比较经典的rpc调用方式:rpc.call()和rpc.cast。社区为了简化rpc的调用,用oslo_messaging进行了一系列封装,供组件调用。

Rpc.call()是一种同步调用的方式

RPC远程过程调用技术手记

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远程过程调用技术手记的主要内容,如果未能解决你的问题,请参考以下文章

RPC协议学习手记:thrift

2016-04-25-信息系统实践手记6-JS调用Flex的性能问题一例

Python中调用自然语言处理工具HanLP手记

袋鼠云研发手记 | Easy[V]数据可视化揭秘:Threejs倒影解析

IntelliJ手记

IM通讯协议专题学习:金蝶随手记团队的Protobuf应用实践(原理篇)