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
及端口号保证其唯一性,但是对于在整个生命周期中需要迁移的远程对象,这种定义方式无法保证其唯一性
Ø
定位服务帮助客户根据远程对象引用定位远程对象,它使用一个数据库将远程对象引用映射成他们当前的大概位置。
Ø
对于没有移动的对象(保存在缓存中)可以尝试用该地址引用,对于已经移动的对象则需要广播一条请求,找到该对象