RMI与RPC

RMI与RPC

转自:http://ggmm.blog.sohu.com/48993964.html                            

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

分布式对象如何构成

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

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

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

分布式对象的优势

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

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

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

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

分布式对象模型

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

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

RMI (Remote Method Invocation )

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

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

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

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

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

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

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

RMI 的实现

通信模块

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

远程引用模块

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

Ø 表的内容:

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

每个本地代理的表项

Ø 动作:

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

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

代理类

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

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

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

调度程序类

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

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

骨架类

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

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

服务器程序和客户程序

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

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

绑定程序

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

服务器线程

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

远程对象的激活

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

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

持久对象存储

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

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

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

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

对象定位

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值