CMU 95702 Distributed Systems 笔记。简单介绍分布式系统中解决 interoperability concern 的几种方案 Cobra’s CDR, Java serialization 和 XML/JSON。这章整理的比较简单。
一言以蔽之,middleware 是为了更好的与 remote server 交流。
Interoperability concern
分布式系统里的互操作性问题。
- Big/Little Endian byte ordering may differ
- Floating point representation may differ
- Binary vs Unicode
如果 j=3, binary 表示就是 00…011,而 unicode 表示是 0000000000110011,如果两端没有达成一致,那么就会出错。
The receiver had better know which one we are using。
假设我们用 C++ 写了 TCP server,那么我们可以写个 JAVA TCP connection 来连接 server 吗?可以!
C++ 和 JAVA 都知道怎么 open 一个 TCP connection。
假设 client 把一个 java object 发给了 server,这个 object 的内容可以重新被封装成 c++ 的 object 吗?不可以!
三种解决方案
CORBA’s CDR
双方都知道 message 的 data type 和 order。双方在交流前都有一个 IDL(Interface description language 接口描述语言),这和 google 的 protocol buffers 差不多。XML, XSDL, WSDL 都可以作为 IDL。
如下面一段 C 的代码。
我们可以让 CORBA Interface Compiler 来做合适的 marshalling 和 unmarshalling operation,无论是 C 还是 JAVA。
CORBA’s CDR 的特点是 - 非常快!所以传送的信息不包括 data type,只有表格中的右边一栏数据。
Java serialization
Java’s serialization 本身可以用来 marshal 和 unmarshal,所以并不需要 IDL。双方事先也不知道 data type。
如下面一段 Java 的代码。
Java 序列化的特点是有很多 data (如 class name, version number, data type 等)来 describe 真正的 data。
Web Service use of XML
格式:
- 相对前两种方法来说会比较慢。因为它是 text 形式而前两种方法是 binary 形式。
- HTTP header 需要声明 Content-Type: text/xml; charset: ISO-8859-1
- 可以表示任何 binary message,因为 binary data(图片和其它加密的元素)可以被表示成 Base64
- 必须遵循 XSDL 的语法。
- 支持各平台。
Web Service use of JSON
格式:
- 可以表示任何 binary message,因为 binary data(图片和其它加密的元素)可以被表示成 Base64
- 必须遵循 JSON 的语法。
比较
- Marshalling and external data representation
binary, xml/json text - Interoperability
corba flexibility, java requires both sides, xml/json interoperable - Security
- Reliability
TCP: reliable as it checks if the message is arrived
UDP: not reliable - Performance
corba > java > xml/json(package and unpackage) - Remote references
- Full OOP
- Describe how the protocols of the internet allow for heterogeneity
- Describe how middleware allows for heterogenity
hides low level implementation
Pass pointers
在分布式的 OOP 中,我们需要传送 pointers,包括以下信息。
UDP Based Request-Reply Protocol
直接上图和代码。
代码:
Failure model
doOperation 可能在 waiting 的时候 timeout,我们要做什么?
- 返回给 caller 一个错误信息
- response 可能会丢失,所以我们告诉 client 让 client try and try 直到确认服务器挂了。这带来的结果是 client 可能会收到同样的信息。
Handle duplicates
根据 client 的 acknowledgement 来清空历史。
Request-Reply Message Structure
|
|