分布式对象和远程调用

一.引言

1.1 分布式对象技术要解决的基本问题

  分布式对象技术是在面向对象技术的基础上发展起来的,它要解决的主要问题是位于不同进程中的对象之间的调用问题。

支持访问异地对象,支持访问异构对象(java平台调用C、vb,C++)。

1.2 中间件

  参考http://kb.cnblogs.com/page/196448/ 

  1.中间件是一种软件,它提供基本的通信模块和其他一些基础服务模块,使得应用程序开发提供平台。

  中间件技术提供了一个编程的抽象,来屏蔽上述的异质问题。

  通信协议:独立于网络底层的传输协议。

  硬件:数据类型在不同的硬件平台上有不同的表示。

  操作系统:在操作系统层上提供更高级的抽象API,屏蔽操作系 统的异构。

  编程语言:CORBA通过IDL,可以使得不同的语言写的代码互相 调用。

1.3 接口

  一个模块的接口包含了其他模块可访问的方法 的定义(没有实现)和变量。有些情况,需要调用同一个方法,但是的具体 实现的不同,接口可以做到这一点。分布式系统中的接口,同一个地址空间,模块之间的通信可以通过访 问公共变量,但是远程调用不能直接访问变量,只能通过属土参数和输出参数,指针不能作为参数传递或者作为结果返回。

  RPC’s Service interface
  对服务器一组过程的说明,定义每个过 程的输入输出参数,供客户端调用。
  RMI’s Remote interface
  对一个对象的方法的说明。
  可以传递一个对象或者远程对象的指针, 也可以返回这两种类型,这是与过程调 用最大的不同。

  接口定义语言(IDLs—Interface Definition Languages ),Java RMI中可以直接定义接口,只能 被java语言调用
其它中间件系统提供了IDLs. e.g. CORBA IDL (n1), DCE IDL and DCOM IDL,允许用其它语言实现的对象来调用, 具有跨平台功能。

1.4 RRP协议

  在谷粉找,就这一个http://www.slideshare.net/chinainvent/totemsrprrp

1.5 单播 组播 广播  多播 泛洪区别

  单播、多播和广播单播”(Unicast)、“多播”(Multicast)和“广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在?

  1.单播:网络节点之间的通信就好像是人们之间的对话一样。如果一个人对另外一个人说话,那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行。单播在网络中得到了广泛的应用,网络上绝大部分的数据都是以单播的形式传输的,只是一般网络用户不知道而已。例如,你在收发电子邮件、浏览网页时,必须与邮件服务器、Web服务器建立连接,此时使用的就是单播数据传输方式。但是通常使用“点对点通信”(Point to Point)代替“单播”,因为“单播”一般与“多播”和“广播”相对应使用。

  2.多播:“多播”也可以称为“组播”,在网络技术的应用并不是很多,网上视频会议、网上视频点播特别适合采用多播方式。因为如果采用单播方式,逐个节点传输,有多少个目标节点,就会有多少次传送过程,这种方式显然效率极低,是不可取的;如果采用不区分目标、全部发送的广播方式,虽然一次可以传送完数据,但是显然达不到区分特定数据接收对象的目的。采用多播方式,既可以实现一次传送所有目标节点的数据,也可以达到只对特定对象传送数据的目的。   IP网络的多播一般通过多播IP地址来实现。多播IP地址就是D类IP地址,即224.0.0.0至239.255.255.255之间的IP地址。Windows 2000中的DHCP管理器支持多播IP地址的自动分配。
  3.广播:“广播”在网络中的应用较多,如客户机通过DHCP自动获得IP地址的过程就是通过广播来实现的。但是同单播和多播相比,广播几乎占用了子网内网络的所有带宽。拿开会打一个比方吧,在会场上只能有一个人发言,想象一下如果所有的人同时都用麦克风发言,那会场上就会乱成一锅粥。集线器由于其工作原理决定了不可能过滤广播风暴,一般的交换机也没有这一功能,不过现在有的网络交换机(如全向的QS系列交换机)也有过滤广播风暴功能了,路由器本身就有隔离广播风暴的作用。   

  广播风暴不能完全杜绝,但是只能在同一子网内传播,就好像喇叭的声音只能在同一会场内传播一样,因此在由几百台甚至上千台电脑构成的大中型局域网中,一般进行子网划分,就像将一个大厅用墙壁隔离成许多小厅一样,以达到隔离广播风暴的目的。   

  在IP网络中,广播地址用IP地址“255.255.255.255”来表示,这个IP地址代表同一子网内所有的IP地址。

  参考文献http://www.cnblogs.com/rogerroddick/archive/2009/08/31/1557228.html

1.6 RSS

  RSS 是一种用于共享新闻和其他Web内容的数据交换 规范,起源于 网景通讯公司 的推"Push"技术,将订 户订阅的内容传送给他们的 通讯协同格式 (Protocol)。

二.分布式对象之间的通信

2.1对象模型(The object model)

  对象相当于server, 调用该对象方法的程序是client.作为 server的对象需要访问其它对象的方法 时,它就是client。
进程中可以包含多个对象,本地的和远程的。调 用其它进程的对象叫远程调用,即使在同一台机 器上,不同的地址空间的调用也叫远程调用.
  提供可被远程调用方法的对象叫远程对象。调用远程对象必须先获得远程对象的引用。远程对象通过远程接口定义可被远程访问的方法。

  分布对象的远程调用不能保证每次调用都确定被执行。RRP协议通常采用一些措施来保证所要求的消息传递保障。
对于RRP协议,选择不同的策略,以提供不同的提交的保证。
  Retry Request message:是否重发请求,直到收到应答或者确信服务器已经不工作了。
  Duplicate filtering:当有重复传输的情况下,是否在服务器端过滤掉重复的请求
  Retransmission of result:是否保存结果的历 史记录用于重发,以便在结果丢失的情况下不需要重复执行请求

  本地调用一定会执行,且只执行一次。exactly once
  远程调用不能保证exactly once语义,远程调用使用RRP协议,它有三种语义形式:
  Maybe –客户端没有接收到回复,客户端能判 断的结论是:请求可能被执行,返回结果丢 失;也可能没有被执行,请求消息丢失或者远 程对象的机器不宕机。如果在设计上没有考虑重发请求,则是maybe
语义。
  存在的问题:不能保证系统正确工作。

   At-least-once – 客户端得到一个结果,说明请求 至少被执行了一次,也可能多于一次。在它收到一个异常时,应该重发请求,直到得到结果。(Sun RPC)
  存在问题:
  任意故障:如果调用请求被重复发送,远程 方法可能被执行一次,多次执行可能引起错误的结果。如果对象提供的操作是幂等操作,就不存在任意故障。
  增加消息量:当远程服务器不工作,会导致 不断重发请求,增加消息量。可以采用超时 判断,来结束重发。

  At-most-once – 客户端收到一个结果,表明请求被执行了一次,并且只执行一 次;或者收到一个异常,表明方法没有 被执行到(JavaRMI)。
  有些应用不允许一次请求被执行多次,需要这种语义。
  措施:在服务器端过滤重复请求,或者 在在服务保存结果,可以保证方法不被 重复执行。
  存在问题:增加服务器处理的负担。

  基于TCP/IP连接的调用语义:当一个进程得知与对方的连接断开了,以下 三种情况是可以推断的:
  某个进程退出或关闭了连接
  exactly once.
  服务器上的进程崩溃了
  at most once.
  网络拥塞
  at least once

  根据远程调用的容错手段,决定了调用 语义 ????????

三.分布式程序设计的模型

3.1.RPC

  远程过程调用(RPC--Remote Procedure Call ),不同进程之间的过程的调用,但是是相同的语言环境。

  RPC的目的是可以像程序调用一样使用远程 服务。RPC 使用的是客户机/服务器模式。
  服务程序就是一个服务器(server),server提供一个或多个远程过程;请求程序就是一个客户机(client),client向server发出远程调用。

  程序调用:如何使远程的过程调用看起来 和本地的过程调用没有区别的问题
网络通信:调用进程和被调用进程间的网 络比本地计算机有更复杂的特性。例如, 它可能限制消息尺寸,并且有丢失和重排消息的可能,安全问题;
  操作系统:运行调用和被调用进程的计算 机可能有明显不同的体系结构和数据表示 格式;
  编程语言:跨语言之间的互操作问题;

  RPC引入了存根(Stub)的概念,比如服务端有某个函数fn(),它为了能够被远程调 用,需要通过编译器生成两个stub:
  客户端的一个stub:c_fn()
  服务器端的一个stub:s_fn()
  在客户端,一个进程在执行过程中调用到了函数 fn(),此函数的具体实现是在远程的某台机器上,那么此进程实际上是调用了位于当地机器上的另外 一个版本的fn()(即c_fn()),当客户端的消息发送到服务器端时,服务器端 也不是把消息直接就交给真正的fn(),而是同样 先交给一个不同版本的fn()(即s_fn())

  Stub的主要功能是对要发送的参数进行 marshal(可理解成一种打包操作)和对接受 到的参数(或返回值)进行unmarshal(解包)。Marshal操作将要发送的数据制成一种标 准的格式(在DCE RPC系统中,此格式 称做Network Data Representation(NDR)格式)unmarshal再从NDR格式数据包中读出所需数据。

  Client stub的功能:收集调用远程函数需要的参数,将这些参数marshal成消息,即把消息转化 成标准的网络数据表示(network data representation , NDR) 格式,用于在网络上传递,调用客户端的运行时系统(Client runtime system)将此消息发送给服务器端。当服务器端将结果消息返回后,将结果消息unmarshal,把结果返回给应用进程。

  Server stub的功能:对发送给它的参数消息unmarshal,收集 参数调用位于本机上的过程,将此过程执行的结果marshal成消息,然 后调用服务器端的运行时系统将结果消 息发送给客户端。

  IDL compiler的功能就是对编辑好的IDL 文件进行编译,编译后生成了下面的三个文件:Header是一个头文件,此头文件包含 了此IDL文件中的全局唯一标示符,数 据类型定义,有关的常量定义,以及 函数原型。客户代码和服务器代码中 包含都要包含header文件,Client stub即客户端的stub程序。Server stub即服务器端的stub程序。

  运行时系统:客户端的运行系统将客户端stub产生的消 息可靠的传送给server,运行时系统利用TCP/UDP等协议,将消 息发送到Server,服务端的运行时系统都侦听某个众所周 知的socket端口,接受请求。

3.2RMI

  远程方法调用(RMI--Remote Method Invocation ),一个进程调用另一个进程中对象的方法,两个进 程可以在同一台主机,也可以在不同的主机。

  从RPC到RMI变化:从过程(静态)->面向对象(动态),从函数调用->对实例的操作。
  问题:谁来创建实例对象?什么时候创建?如何取得 对象的引用?

  RMI系统由以下几个部分组成:
  运行远程服务的服务器
  需要远程服务的客户端程序
  远程服务的接口定义(Remote Interface)
  远程服务的实现(Remote Service)
  Stub和Skeleton文件
  RMI命名服务,使得客户端可以发现远 程服务。

3.3 事件驱动

  事件驱动(Event-based model),注册一些感兴趣的对象的事件,事件发生时会的到通知。

  目的:让一个对象能够对另一个对象发生的变化做出反应
  举例:文件被修改了,一个电子书签变化了位置,发布与订阅(Publish/subscribe paradigm),产生事件一方发布事件的类型,接收事件一方订阅感兴趣的事件类型,事件放生时,通知订阅一方。
  分布式事件驱动系统的两个特性:
  异构性:已有的分布式系统的一些模块原本不是为 了互操作而设计的,现在能够让他们协同工作,通 过接收方公布远程接口。
  异步性:不能要求发布程序和订阅程序同步。

  这和Java的观察者模型有联系吗?

  和进程间消息传递的语义类似,取决于应用 需求和所采用的措施。
  对可靠性要求较低的需求,一些网络游戏 了解其它玩家的最新状态,普通IP组播协 议。
  对可靠性要求较高的需求,股票交易所系 统。需要采用可靠的组播协议。
  实时要求。 

  分布式编程可提供租用、分布式交易和分布式 事件。
  租用租用与租用一套公寓很类似。我们在租用 一套公寓时,一般会商定使用该公寓的时间。 类似地,在Jini中,对象彼此之间商定租期。 例如,当某设备使用Discovery and Join协议发 现网络时,它就注册一段租用时间。在租约到 期之前,该设备必须重新商定租期。这样,如 果租约到期或设备拔下后,该设备在Lookup中 的记录就会被自动删除。这就是分布式垃圾收 集的工作原理。

五.总结

  自己实现计算引擎。

 

posted @ 2015-05-11 12:59  加拿大小哥哥  阅读(2760)  评论(0编辑  收藏  举报