`

rpc rmi区别

    博客分类:
  • SSH
 
阅读更多

1.

RMI和RPC之间最主要的区别在于方法是如何别调用的。在RMI中,远程接口使每个远程方法都具有方法签名。
如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口上,
那么这个新方法就不能被RMI客户方所调用。在RPC中,当一个请求到达RPC服务器时,
这个请求就包含了一个参数集和一个文本值,通常形成“classname.methodname”的形式。
这就向RPC服务器表明,被请求的方法在为“classname”的类中,名叫“methodname”。
然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。
这里的参数类型是与RPC请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方。

2

昨天听了汪老师讲课,感觉不错,做个笔记先:

分布式对象如何构成

 

 对象的状态由它的实例变量值组成

 

 每个对象在逻辑上是分区的,可以物理地分布在不同的进程或计算机中

 

 分布式对象系统可采用客户——服务器体系结构;对象由服务器管理,客户通过RMI调用对象的方法

 

分布式对象的优势

 

将客户和服务器对象分布在不同的进程中

 

 提高封装性:对象的状态只能通过内部方法访问

 

 提高数据安全性:对于并发的RMI可能访问同一个对象,可以通过条件变量或同步原语控制并发访问

 

 有益于异构系统:异构系统在不同上下文中具有不同的数据格式,使用RMI的客户对于数据格式是透明的

 

分布式对象模型

 

 远程对象引用:远程对象的在分布式系统中的唯一标识;如果某个对象可以访问远程对象的远程对象引用,那么它就能调用远程对象的方法

 

 远程接口:可以被其他远程对象调用的方法集合,不在相同进程中的对象只能调用远程接口定义的方法;CORBA提供IDL定义远程接口,客户不需要为了能够远程调用其方法而使用与远程对相同的语言;Java RMI以与其它Java接口相同的方式定义远程接口;通过扩展Remote接口而获得远程接口的能力

 

RMIRemote Method Invocation

 

 RMI与本地方法调用存在不同,可能有多次调用

 

 RMI调用语义(取决于请求-应答协议的实现方式:重发请求消息、过滤重复请求、重传结果)

 

Ø 或许调用:出现网络故障或系统崩溃而没有容错措施或超时后没有重发请求,使得远程方法的执行情况不明确

 

Ø 至少一次调用:调用者或者得到执行结果,或者接收到异常信息,保证服务器执行过RMI,通过重发请求消息实现

 

(问题:只能解决网络故障,无法解决系统故障

 

多次请求可能引发存储错误或返回错误结果:幂等操作)

 

Ø 至多一次调用:通过容错和重发请求消息、过滤重复请求实现,CORBAJava RMI都采用此调用语义

 

RMI的实现

 

 通信模块

 

Ø 实现请求——应答协议,服务器端通信模块为被调用对象选择调度程序,传输其本地调用,该本地引用取自远程引用模块,用来替换请求消息中的远程对象标识符

 

 远程引用模块

 

Ø 负责翻译本地和远程对象引用以及创建远程对象引用。通常维护一个远程对象表,记录进程的本地和远程对象引用的对应关系

 

Ø 表的内容:

 

 该进程拥有的所有远程对象的表项

 

 每个本地代理的表项

 

Ø 动作:

 

 远程对象第一次作为参数或结果传递时,它创建一个远程对象引用并加入到表中

 

 当引用对象随请求或应答到达时,它提供对应的本地对象引用,可能指向一个远程对象或一个代理

 

 代理类

 

Ø 使远程方法调用对客户透明,它不执行调用,而是将调用放在消息里传递给远程对象,隐藏了远程对象引用的细节、参数的编码、结果的编码以及客户消息的发送和接收

 

Ø 代理类实现它所代表的远程对象的远程接口定义的方法

 

Ø 代理中的每个方法会把一个目标对象的引用,它自身的方法ID和它的参数编码进一个请求消息并发送到目标,等待应答消息,然后编码并将结果返回给调用者

 

 调度程序类

 

Ø 接收来自通信模块的请求或应答信息,并传递消息到相应的代理或骨架

 

Ø 调度程序和代理对远程接口中的方法使用相同的方法ID

 

 骨架类

 

Ø 远程对象具有的类,用于实现远程接口中的方法

 

Ø 骨架方法解码请求消息中的参数,并调用远程对象中的相应方法,等待调用的完成,然后将结果和任何异常信息编码进应答消息,发送给代理的方法

 

 服务器程序和客户程序

 

Ø 服务器程序包含调度程序类、骨架类以及支持的所有远程对象类的实现,同时还包含一个初始化部分(负责创建和初始化至少一个包含在服务器上的远程对象),另外的远程对象可能应客户发出的请求而创建

 

Ø 客户程序通过代理类,用一个绑定程序查找远程对象引用。远程对象只能在初始化部分创建或通过专门的远程接口方法中创建(厂方法)

 

 绑定程序

 

Ø 是一种独立的服务,它维护一张表,包含从文本名字倒远程对象引用的映射,服务器根据这张表按照名字注册它们的远程对象,客户根据这张表查找这些远程对象

 

 服务器线程

 

Ø 为避免一个远程调用的执行延误另一个远程调用的执行,服务器一般为每个远程调用的执行分配一个独立的线程

 

 远程对象的激活

 

Ø 避免服务进程长时间的活跃而造成资源浪费,采用激活方式,当客户需要服务时才启动

 

Ø 启动包含远程对象的服务器进程成为激活器

 

 持久对象存储

 

Ø 在进程两次激活之间仍然保证存活的对象成为持久对象

 

Ø 通常由持久对象存储管理,在磁盘上以编码格式存储持久对象的状态

 

Ø 当需要调用持久对象时激活该对象,该对象从持久对象管理中退出

 

Ø 当不需要持久对象时,可以在主存中钝化该对象,在大多数情况下,为了容错和数据一致性,对象需要保存在持久对象存储中

 

 对象定位/span>

 

Ø 通常可以通过远程对象的url及端口号保证其唯一性,但是对于在整个生命周期中需要迁移的远程对象,这种定义方式无法保证其唯一性

 

Ø 定位服务帮助客户根据远程对象引用定位远程对象,它使用一个数据库将远程对象引用映射成他们当前的大概位置。

 

Ø 对于没有移动的对象(保存在缓存中)可以尝试用该地址引用,对于已经移动的对象则需要广播一条请求,找到该对象





  


  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics