版权归原作者所有,如有侵权,请联系我们

[科普中国]-软件消息传递

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

在计算机科学中,软件消息传递(Message passing)是一种通信的形式,在并发计算、并行计算、面向对象编程与进程间通信中使用。在这种模式中,进程或对象以发送及接收消息的方式来达成同步。不同于传统程序设计通过名字直接调用(invoking)一个进程、子例程或者函数,消息传递直接发送消息给一个进程,依赖进程或基础框架来调用实际执行的代码。可分为同步方式与异步方式。

简介为便于统一,国际标准化组织制定了协议(protocol),将电信网中的各部分进行了明确的分工,定义了接口,并对接口进行了详细的定义:规定了经由 A 进程到 B 进程只能传递哪些信息,经由 B 进程到 A 进程又只能传递哪些信息。信息在软件中的表示,就是消息。软件消息传递是一种通信范型,在这种模型中,由一个传信者,将消息(messages)送给一个,或多个收信者。消息的形式,根据操作系统与编程语言的支持,而有所不同,常见的有方法(method),信号(signals)与数据包(data packets)。常见软件消息传递有开放网络运算远程过程调用、CORBA、Java RMI、Distributed COM、SOAP等。

公共对象请求代理体系结构公共对象请求代理体系结构(Common Object Request Broker Architecture, CORBA)是由OMG(对象管理组织,Object Management Group)提出的应用软件体系结构和对象技术规范,其核心是一套标准的语言、接口和协议,以支持异构分布应用程序间的互操作性及独立于平台和编程语言的对象重用。CORBA 建立了一个跨语言的分布式对象体系构架,提供了一个多种语言对象间进行交互的分布式操作规范。CORBA 技术的产生是面向对象技术的发展和分布式网络环境发展的必然结果。随着计算机软件及硬件的发展,计算机已经应用到科研,教育,国防,及经济发展的各个领域,软件的规模不断扩大,复杂的计算机应用使得模块化的软件设计及开发已经不适合大型软件的设计与开发。面向对象技术的产生和发展解决了代码的可重复利用,数据封装等模块化设计难以解决的问题。同时面向对象的设计和开发使得代码更容易控制和维护,从而更适合于大型软件的设计与开发,成为软件设计的发展趋势。另外,在计算机网络的发展方面,计算机应用的重心从单机时代逐渐向 C/S的网络结构发展。不同的硬件厂商,不同的操作平台,以及日趋复杂的网络应用,使得分布式软件的设计开发变得复杂,软件成本提高,并且在不同平台上难以兼容。CORBA 涉及的基本概念:

对象:CORBA 规范中的对象符合传统对象的语义,具有封装、继承、多态等特点。一个对是一个可标识的被封装实体,它能按照客户请求提供一个或多个服务。对象引用:这是用来指定对象的标识符称为对象引用。一个对象可以拥用多个对象引用,但一个对象引用必须且仅仅对应于一个对象。

对象实现:是指对象系统的实现,即服务提供方。实现模型包括两个部分:执行模型和构造模型。执行模型描述如何执行服务,执行请求服务所需要的计算活动包括计算所请求的结果以及更新系统状态。构造模型描述如何定义服务。CORBA 规范中用接口来描述服务提供方可以执行的操作。

接口:接口是使用 IDL 描述的一组操作,客户可以通过接口向对象请求这些操作。接口继承提供的符合机制允许对象支持多个接口,属性是接口的一部分。在逻辑上,属性等价于声明一对辅助函数:一个获取函数的值(get);一个设置属性的值(set)。

请求:请求方被称为客户,客户通过构造一个请求来要求得到服务。在请求中要指定提供服务的对象实现、执行的操作、操作上下文以及操作多用到的参数。

激活:在执行服务请求、对象或对象实现中的方法被调用,如果对象回对象实现的初始状态不能满足方法调用的要求,便需要通过某种方法使其状态发生改变,以满足方法调用的要求,这个过程称为激活。

分布式系统需要在不同主机之间能够进行通信。Java 语言支持基本的通信机制Socket通信,这种通信方式非常灵活,并且可以满足大多数应用的通信需求。但使用Socket技术需要在客户端和服务器端对传递的信息编码和解码,并且这以过程比较复杂,非常容易出错1。

远程过程调用远程过程调用(Remote Procedure Call,简称 RPC)把通信接口抽象到过程调用级别,从而编程人员不必关心底层的通信过程。但是远程过程调用不能很好的适应分布式对象系统。在这种系统中,不同地址空间的对象需要相互通信,这就需要远程方法调用(RMI)。远程方法调用的优势就是编程人员不必编写消息的编码、解码过程,从客户端来看,远程方法调用和远程过程调用很相似。Java 远程方法调用(Java Remote Method Invocation,简称Java RMI )是一种分布式系统技术,通过使用Java语言来编写分布式对象。它允许一个Java虚拟机(JVM)调用运行在位于网络中另一处JVM的对象方法,它使得多台机器之间可以分布资源和处理负载。在与远程对象的通信过程中,RMI将使用标准机制(用于 RPC 系统):Stub与 Skeleton。远程对象的Stub担当远程对象的客户本地代表或代理人角色。调用程序将调用本地Stub的方法,而本地Stub将负责执行对远程对象的方法调用。在RMI 中,远程对象的 Stub 与该远程对象所实现的远程接口集相同。调用 Stub 的方法时,将执行下列操作:

初始化与包含远程对象的远程虚拟机的连接。

对远程虚拟机参数的进行编组(写入并传输。

等待方法调用结果。解编(读取)返回值或异常。

将值返回给调用程序。

为了向调用程序展示比较简单的调用机制,Stub 将参数的序列化和网络级通信隐藏了起来。在远程虚拟机中,每个远程对象都可以有相应的 Skeleton。Skeleton 负责将调用分配给实际的远程对象实现,它在接收进入方法调用时执行下列操作:解编(读取)远程方法的参数、调用实际远程对象实现上的方法、将结果(返回值或异常)编组(写入并传输)给调用程序;远程引用层远程引用层通过定义 JAVA 远程方法协议实现对远程对象方法的访问;传输层实现对字节流的传输,负责建立和管理不同 JAVA 虚拟机之间的连接。一般采用 TCP/IP 协议实现,但也可以采用 UDP 协议实现字节流的传输。

开放网络运算远程过程调用开放网络运算远程过程调用(Open Network Computing Remote Procedure Call,缩写为ONC RPC),一种被广泛应用的远程过程调用(RPC)系统,是一种属于应用层的协议堆栈,底层为TCP/IP协议。开放网络运算(ONC)最早源自于太阳微系统(Sun),是网络文件系统计划的一部分,因此它经常也被称为Sun ONC 或 Sun RPC。现今在多数类UNIX系统上都实现了这套系统,微软公司也以Windows Services for UNIX在他们产品上提供ONC RPC的支持。2009年,太阳微系统以标准三条款的BSD许可证发布这套系统。2010年,收购了太阳微系统的甲骨文公司确认了这套软件BSD许可证的有效性与适用范围。

简单对象访问协议简单对象访问协议(Simple Object Access Protocol,SOAP)是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。SOAP为了简化网页服务器(Web Server)从XML数据库中提取数据时,节省去格式化页面时间,以及不同应用程序之间按照HTTP通信协议,遵从XML格式执行资料互换,使其抽象于语言实现、平台和硬件。此标准由IBM、Microsoft、UserLand和DevelopMentor在1998年共同提出,并得到IBM,莲花(Lotus),康柏(Compaq)等公司的支持,于2000年提交给万维网联盟(World Wide Web Consortium;W3C),SOAP 1.1版是业界共同的标准,属于第二代的XML协定(第一代具主要代表性的技术为XML-RPC以及WDDX)。用一个简单的例子来说明SOAP使用过程,一个SOAP消息可以发送到一个具有Web Service功能的Web站点,例如,一个含有房价信息的数据库,消息的参数中标明这是一个查询消息,此站点将返回一个XML格式的信息,其中包含了查询结果(价格,位置,特点,或者其他信息)。由于数据是用一种标准化的可分析的结构来传递的,所以可以直接被第三方站点所利用。SOAP封装(envelope),它定义了一个框架,描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们;

SOAP编码规则(encoding rules),它定义了一种序列化的机制,用于表示应用程序需要使用的数据类型的实例;SOAP RPC表示(RPC representation),它定义了一个协定,用于表示远程过程调用和应答;SOAP绑定(binding),它定义了SOAP使用哪种协议交换信息。使用HTTP/TCP/UDP协议都可以。

把SOAP绑定到HTTP提供了同时利用SOAP的样式和分散的灵活性的特点以及HTTP的丰富的特征库的优点。在HTTP上传送SOAP并不是说SOAP会覆盖现有的HTTP语义,而是HTTP上的SOAP语义会自然的映射到HTTP语义。在使用HTTP作为协议绑定的场合中,RPC请求映射到HTTP请求上,而RPC应答映射到HTTP应答。然而,在RPC上使用SOAP并不仅限于HTTP协议绑定。

本词条内容贡献者为:

王慧维 - 副研究员 - 西南大学