📜  分布式系统中的编组

📅  最后修改于: 2022-05-13 01:56:16.749000             🧑  作者: Mango

分布式系统中的编组

分布式系统由位于不同机器上的许多组件组成,这些组件通信和协调操作,在最终用户看来就像一个单一的系统。

外部数据表示:

数据结构用于表示正在运行的应用程序中保存的信息。该信息由消息中的字节序列组成,这些字节在分布式系统的组件之间移动。因此,在传输数据之前,需要将数据结构转换为字节序列。在消息到达时,数据也应该能够转换回其原始数据结构。

不同类型的数据在计算机中处理,并且这些类型在必须传输数据的每个位置都不相同。单个原始数据项可以具有多种数据值,并且并非所有计算机都以相同的顺序存储原始值(如整数)。不同的架构也以不同的方式表示浮点数。整数有两种排序方式,大端顺序,最高有效字节 (MSB) 放在最前面,小端顺序,最高有效字节 (MSB) 放在最后或最低有效字节 (LSB) ) 放在第一位。此外,还有一个问题是用于表示字符的代码集。 UNIX 系统上的大多数应用程序使用 ASCII字符编码,每个字符使用一个字节,而 Unicode 标准每个字符使用两个字节,并允许以多种不同语言表示文本。

应该有一种方法可以将所有这些数据转换为标准格式,以便可以在计算机之间成功发送。如果已知两台计算机属于同一类型,则可以跳过外部格式转换,否则在传输之前将值转换为约定的外部格式,然后在接收时将其转换为本地格式。为此,值以发件人的格式发送,连同格式说明,收件人在必要时进行转换。不过值得注意的是,字节在传输过程中永远不会改变。任何可以作为参数提供或作为结果返回的数据类型都必须能够被转换,并且各个原始数据值以可接受的格式表示,以支持远程过程调用 (RPC) 或远程方法调用 (RMI) 机制.因此,外部数据表示是表示已达成共识的数据结构和原始值的标准。

  • 编组:编组是将数据结构集合传输和格式化为适合在消息中传输的外部数据表示类型的过程。
  • 解组:与此过程相反的是解组,这涉及在传输的数据到达时重新格式化以在目的地重新创建原始数据结构。

方法:

有三种方法可以在计算机之间的各种数据之间成功通信。

1.通用对象请求代理架构(CORBA):

CORBA 是由对象管理组 (OMG) 定义的规范,它是目前大多数分布式系统中使用最广泛的中间件。它允许具有不同架构、操作系统、编程语言和计算机硬件的系统协同工作。它允许软件应用程序及其对象相互通信。它是创建和使用分布式对象的标准。它由五个主要部分组成。组件及其函数如下:

  • 对象请求代理(ORB):它为对象提供了一个通信基础设施,以便通过网络进行通信。
  • 接口定义语言(IDL):它是一种规范语言,用于在软件组件中提供接口。例如,它允许在用 C++ 和Java编写的软件组件之间进行通信。
  • 动态调用接口 (DII):使用 DII,允许客户端应用程序使用服务器对象,甚至在编译时不知道它们的类型。在这里,客户端获得一个 CORBA 对象的实例,然后可以在相应的对象上动态地发出调用请求。
  • 接口存储库(IR):顾名思义,可以将接口添加到接口存储库中。 IR 的目的是客户端应该能够找到在编译时未知的对象以及有关其接口的信息,然后将请求发送到 ORB。
  • 对象适配器(OA):用于访问对象引用生成等 ORB 服务。
通用对象请求代理架构 (CORBA)

CORBA 中的数据表示:

公共数据表示 (CDR) 用于描述在对 CORBA 分布式对象进行远程调用期间作为参数或结果提供的结构化或原始数据类型。它允许客户端和服务器的内置计算机语言相互通信。例如,它将little-endian 转换为big-endian。

有 15 种基本类型:short(16 位)、long(32 位)、unsigned short、unsigned long、float(32 位)、double(64 位)、char、boolean(TRUE、FALSE)、八位字节(8 位),any(可以表示任何基本类型或构造类型),以及各种复合类型。

CORBA CDR 构造类型:

让我们看一下类型及其表示:

  • 序列:它指的是长度(无符号长),后面跟着元素的顺序
  • 字符串:指长度(unsigned long)后跟字符顺序(也可以有宽字符)
  • 数组:数组的元素遵循顺序,长度是固定的,所以没有指定。
  • struct:按组件声明的顺序
  • 枚举: unsigned long 在这里,值由声明的顺序指定。
  • union:类型标签后跟所选成员

例子:

struct Person {
string name;
string place;
long year;
};

编组CORBA:

根据要在消息中传输的数据项类别的规范,可以自动生成编组 CORBA 操作。 CORBA IDL 描述了数据结构和基本数据项的类型,并提供了一种语言/符号来指定参数类型和 RMI 方法的结果。

2、Java的对象序列化:

Java远程方法调用 (RMI)允许您将对象和原始数据值作为参数和方法调用传递。在Java中,术语序列化是指将对象(类的实例)或一组相关对象放入适合保存到磁盘或在消息中发送的串行格式的活动。

Java提供了一种称为对象序列化的机制。这允许将对象表示为包含有关对象数据和对象类型以及存储在对象中的数据类型的信息的字节序列。序列化对象写入文件后,可以从文件中读取并反序列化。您可以使用表示对象及其数据的类型信息和字节在内存中重新创建对象。

Java的对象序列化

此外,对象可以在一个平台上序列化,在完全不同的平台上反序列化,因为整个过程是独立于 JVM 的。

例如,与 CORBA IDL 中定义的 Person 结构等效的Java类可能是:

Java
import java.io.*;
public class Person implements Serializable {
  
  public String name;
  public String place;
  public int phonenumber;
  public void letter() {
     System.out.println("Issue a letter to " + name + " " + place);
  }
}


3. 可扩展标记语言(XML):

客户端使用 XML 与 Web 服务进行通信,XML 也用于定义 Web 服务的接口和其他方面。然而,XML 用于各种不同的应用程序,包括归档和检索系统;虽然 XML 存档比二进制存档大,但它的优点是可以在任何机器上读取。其他 XML 应用程序包括用户界面的设计和操作系统配置文件的编码。

与使用一组固定标签的 HTML 相比,XML 在用户可以构建他们的标签的意义上是可扩展的。如果一个 XML 文档打算由多个应用程序使用,则标记名称必须是唯一的。

例如,客户端通常通过 SOAP 消息与 Web 服务器交互。 SOAP 是一种 XML 标准,带有 Web 服务及其客户可以使用的标签。因为期望共享消息的客户端和服务器预先知道它包含的信息的顺序和类型,所以一些外部数据表示(例如 CORBA CDR)不需要是自描述的。另一方面,出于各种原因,XML 被设计为可供各种应用程序使用。通过包含标签和使用命名空间来指定标签的含义,这已经成为可能。此外,标签的使用允许应用程序只选择他们需要处理的文档部分。

例子:

XML definition of the Person struct:

  John
  England
  1876
  

用法:

编组用于创建各种远程过程调用 (RPC) 协议,其中单独的进程和线程通常具有不同的数据格式,因此需要在它们之间进行编组。

为了跨 COM 对象边界传输数据,Microsoft 组件对象模型 (COM) 接口指针采用编组。当基于公共语言运行时的类型必须通过编组与其他非托管类型连接时,同样的事情也会发生在 .NET 框架中。 DCOM 代表分布式组件对象模型。

Microsoft 组件对象模型 (COM)

基于跨平台组件对象模型 (XPCOM) 技术的脚本和应用程序是编组至关重要的另外两个示例。 Mozilla 应用程序框架大量使用 XPCOM,它大量使用了编组。

因此,XML(可扩展标记语言)是一种基于文本的格式,用于表达结构化数据。它旨在表示在 Web 服务中客户端和服务器交换的消息中发送的数据

原始数据类型以前两种方式编组为二进制形式——CORBA 和 Java 的对象序列化。原始数据类型在第三种技术 (XML) 中以文本形式表示。数据值的文本表示通常比其二进制表示长。 HTTP 协议是文本方法的另一个例子。

另一方面,类型信息包含在Java序列化和 XML 中,但方式不同。尽管Java序列化了所有基本类型信息,但 XML 文档可以引用命名空间,命名空间是外部指定的名称组(带有类型)。