分布式对象和远程调用

一.引言

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-10-13 04:18:32

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

Java[2] 分布式服务架构之java远程调用技术浅析(转http://www.uml.org.cn/zjjs/201208011.asp)

转自:http://www.uml.org.cn/zjjs/201208011.asp 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来一探究竟,抛

Atitit.分布式远程调用  rpc  rmi  CORBA的关系

Atitit.分布式远程调用  rpc  rmi  CORBA的关系 1. 远程调用(包括rpc,rmi,rest)1 2. 分布式调用大体上就分为两类,RPC式的,REST式的1 3. RPC(远程过程调用)是什么 1 4. 传输的数据2 5. 序列化与反序列化3 6. ref  谁能用通俗的语言解释一下什么是 RPC 框架? - Java - 知乎.html3 1. 远程调用(包括rpc,rmi,rest) RPC的协议有很多,比如最早的CORBA,Java RMI,Web Service的

分布式服务架构之java远程调用技术浅析

分布式服务架构之java远程调用技术浅析     在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来一探究竟,抛砖引玉,欢迎大家提供更多的实现远程通讯

.Net 之 RPC 框架之Hprose(远程调用对象)

实现远程调用对象,跨进程访问对象,可实现分布式 首先给服务端和客户端 nuget Hprose 可使用tcp和http两种调用方式 服务端 using Hprose.Server; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace rpc { class TestService { public string Hello(string name) { re

远程调用时的分布式事物问题

前提 所有服务均有独立的事物管理机制,相互间没有任何关联. 所有业务接口都有对应的补偿方法,用于将已经更新的数据还原到上一次的状态. 本次实例为同步业务,理想状态下,只有全部成功或全部失败两种情况. 正式开始 正常流程 一切安好. 中途异常 - 补偿成功 虽然发生了失败,但所有补偿都成功了.没有什么问题 中途异常 - 补偿失败 此时,主服务有三种处理方法 主服务无限重试补偿方法,直到补偿成功. 这里有很麻烦的问题,如果下游的服务器已经停机,此时主服务的无限重试已经没有意义.在最坏的情况下,如果主

远程调用方式概述

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB. Burlap.Hessian.SOAP.EJB和JMS 等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那 深入了解这些技术背后的机制就是必须的了,本文中我们将来一探究竟,抛砖引玉,欢迎大家提供更多的实现远程通讯的技术和原理的介绍. 基本原理 要实现网络机器间的通讯

WebService与RMI(远程调用方式实现系统间通信)

前言 本文是<分布式java应用基础与实践>读书笔记:另外参考了此博客,感觉讲的挺好的,尤其是其中如下内容: 另外,消息方式实现系统间通信本文不涉及.RMI则只采用spring RMI框架来实现效果,更多的则是来讲讲webService及效果. RMI(Remote Method Invocation) ----> spring RMI(配置及实现直接参考spring文档,已经很详细了) spring RMI工作原理图如下: RMI代码结构图: 服务端代码 接口Business.java

远程调用的几种方式

在分布式服务框架中,最基础的问题就是远程服务是怎么通讯的.首先来看看计算机系统网络通信的基本原理,网络通信需要做的就是将流从一台计算机传输到另外一台计算 机,基于传输协议和网络IO来实现,其中传输协议有 tcp.udp等等,tcp.udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议:网络IO,主要有bio. nio.aio三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议.在java领域中知名的有:RMI.

alibaba远程调用框架dubbo原理

alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo.hsf),jms消息服务(napoli.notify),KV数据库(tair)等.这个框架/工具/产品在实现的时候,都考虑到了容灾,扩展,负载均衡,于是出现一个配置中心(ConfigServer)的东西来解决这些问题. 基本原理如图: 在我们的系统中,经常会有一些跨系统的调用,如在A系统中要调用B系统的一个服务,我们可能会使用RMI直接来进行,B系统发布一个RMI接口服务,然后A 系统就来通过RM