分布式对象和远程调用

一.引言

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中 的记录就会被自动删除。这就是分布式垃圾收 集的工作原理。

五.总结

  自己实现计算引擎。

 

时间: 2024-08-01 05:25:32

分布式对象和远程调用的相关文章

Gearman + PHP 实现分布式对象调用

Gearman + PHP 实现分布式对象调用 http://netkiller.github.io/journal/gearman.php.html Mr. Neo Chen (netkiller), 陈景峰(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地518131+86 13113668890+86 755 29812080<netkiller@msn.com> $Id$ 版权 2011, 2012, 2013 http://netkiller.github.io $Date$

微服务架构设计(四):提升微服务分布式远程调用的可靠性与性能

在分布式微服务的架构下, 架构师往往面临著可靠性与性能间的抉择. 当来自某个微服务外部 Client 的远程调用, 要求微服务处理一购买 100 张股票的订单时.假如: A.  架构师所设计的微服务外部 Client 远程调用的 Time Out 时间是 2000 ms. 但, 此次微服务外部 Client 远程调用.微服务成功处理这 100 张股票的订单并送回一确认成功的信息到微服务外部 Client 时, 共花费了 3000 ms.所以, 微服务外部 Client 会误认为, 先前所发送的请

远程调用服务(RPC)和消息(Message Queue)对比及其适用/不适用场合

本文转载,因网上版本几乎都是转载,故不知道哪个才是原版. 重点是共享知识! 在阿里的平台技术部参与开发了Dubbo(远程调用服务)和Napoli(消息解决方案),又给网站应用支持这2个产品2年,了解了这2个产品的实现及应用对这两个产品的用法. 大部分情况下,"给定场景下应该使用这两个产品中哪个"这个问题,大家都会容易决定,而且不需要多少讨论. 我为什么要拿出来讨论一下: 一些场景会比较模糊,觉得都可以使用.这时需要知道产品缺点,而不是看到优势. 一些新人会觉得产品功能是可以替换的,要给

架构设计:一种远程调用服务的设计构思(zookeeper的一种应用实践)

在深入学习zookeeper我想先给大家介绍一个和zookeeper相关的应用实例,我把这个实例命名为远程调用服务.通过对这种应用实例的描述,我们会对zookeeper应用场景会有深入的了解. 远程调用是系统与系统之间的通信机制,它的另一种理解就是进程间的通信.做分布式系统的开发,远程调用技术是其核心技术.远程调用技术可以将一组计算机系统形成一个网络系统,对外提供整体服务,那么这一群的计算机系统就构成了一个更大型,性能更高的计算机系统. 我在前面的博客里介绍了一种分布式网站的架构设计,其中就有一

WEB(Javascript)远程调用方案清单

javascript|web Web远程过程调用(以下简称WebRPC)是在不刷新页面的前提下,对远程方法进行调用,是最近的一个热点:在一些场合下,他甚至成为不可替代的实现方式.WebRPC的实现方式经历了从普通URL读取,隐藏帧,IFrame, XMLHTTP乃至 Flash等.本文将对目前存在的WebRpc方案(产品)进行列表,并作简单评价. 评价将在以下几个方面进行:客户端实现方式,服务器端实现方式,是否自行封装协议,是否支持序列化/反序列化,序列化支持是否完备(原子类型,对象类型),是否

java如何远程调用linux的命令或者脚本

Java通过SSH2协议执行远程Shell脚本(ganymed-ssh2-build210.jar) 使用步骤如下: 1.导包 官网下载: http://www.ganymed.ethz.ch/ssh2/ maven坐标: <dependency> <groupId>com.ganymed.ssh2</groupId> <artifactId>ganymed-ssh2-build</artifactId> <version>210&l

架构师之路-在Dubbo中开发REST风格的远程调用

概述 dubbo支持多种远程调用方式,例如dubbo RPC(二进制序列化 + tcp协议).http invoker(二进制序列化 + http协议,至少在开源版本没发现对文本序列化的支持).hessian(二进制序列化 + http协议).WebServices (文本序列化 + http协议)等等,但缺乏对当今特别流行的REST风格远程调用(文本序列化 + http协议)的支持. 有鉴于此,我们基于标准的Java REST API--JAX-RS 2.0(Java API for REST

Openstack Nova 源码分析 — RPC 远程调用过程

目录 目录 Nova Project Services Project 的程序入口 setuppy Nova中RPC远程过程调用 nova-compute RPC API的实现 novacomputemanager 模块 最后 Nova Project Services nova-api:捕获novaclient发送过来的HTTP请求,并且将它转换为AMQP消息,通过Queue来与别的services通信. nova-conductor:为数据库访问提供了一层安全保障. NOTE:除了nova-

【PHP】远程调用以及RPC框架

前言 一个项目,从开始到版本更新,一直到最后的版本维护.功能在不断增多,对应的代码量也在不断增加,也就意味着项目变得更不可维护,这时候,我们需要用拆分的方式将一个项目打散,以便开发团队更好的对项目进行维护. 分模块 这个阶段,一般也是项目的初级阶段,由于人手不够,一个服务端的接口项目只有一个开发进行维护,根据开发的习惯,会把项目分成若干个模块进行开发,在一个项目下进行部署. 这样做的缺点在于项目会随着版本更新而变得不可维护. 分项目 随着每个模块功能的不断完善,代码变得更加臃肿.这时候需要对项目