1. 模式演化
应用程序不可避免地需要随时间而变化、调整。当新产品推出,或为了更好地理解用户需求,或商业环境发生变化时,就需要不断添加或修改功能。
特别地,许多服务需要支持滚动升级,即每次将新版本的服务逐步部署到几个节点,而不是同时部署到所有节点。滚动升级允许在不停机的情况下发布新版本的服务(因此鼓励频繁地发布小版本而不是大版本),并降低部署风险(允许错误版本在影响大量用户之前检测并回滚)。这些特性非常有利于应用程序的演化和更改。
在滚动升级期间,或者由于各种其他原因,必须假设不同的节点正在运行应用代码的不同版本。因此,在系统内流动的所有数据都以提供向前兼容和向后兼容的方式进行编码显得非常重要。
2. 数据编码格式及兼容性情况
数据通常使用两种不同的数据表示形式:
(1)在内存中:数据结构
(2)在文件或传输中:字节序列
这两个表示之间需要进行类型的转化:从内存中的表示到字节序列的转化称为编码(序列化),相反的过程称为解码(反序列化)
2.1 语言特定的编码
编程语言特定的编码仅限于某一种编程语言,主要目标是快速且简单地编码数据,其存在很多深层次问题:
(1)编码与特定的编程语言绑定在一起,而用另一种语言访问数据就非常困难。
(2)为了在相同的对象类型中恢复数据,解码过程需要能够实例化任意的类,这经常导致一些安全问题。
(3)在这些库中,多版本数据通常是次要的,主要目标是快速且简单地编码数据,所以它们经常忽略向前或向后兼容问题。
基于这些原因,使用语言内置编码方案通常不是个好主意。
2.2 标准化编码:文本格式(JSON、XML与CSV)
JSON、XML和CSV都是标准化的文本格式编码,特别是作为数据交换格式(将数据从一个组织发送到另一个组织),它们非常受欢迎。
JSON(JavaScript Object Notation):JS对象简谱,是一种轻量级的数据交换格式,支持数字格式。
XML(eXtensible Markup Language):可扩展标记语言。不支持数字。
CSV(Comma Separated Values):逗号分隔值文件格式。不支持数字格式。
文本格式存在的一些问题
JSON、XML和CSV的兼容性取决于你如何使用它们。它们有可选的模式语言,这有时是有用的,有时却是一个障碍。这些文本格式对某些数据类型的支持有些模糊,必须小心处理数字和二进制字符串问题。
1. 数字问题
(1)在XML和CSV中,无法区分数字和碰巧由数字组成的字符串(除非引用外部模式)。因为XML和CSV不支持数字,无论解析给我们看的是数字还是字符串,都是以字符串形式存在,然后通过外部模式解析成数字或字符串。
(2)JSON区分字符串和数字,但不区分整数和浮点数,并且不指定精度。
2.字符串问题
JSON和XML对Unicode字符串(即人类可读文本)有很好的支持,但是它们不支持二进制字符串(没有字符编码的字节序列)
3.模式问题
(1)XML 和JSON都有可选的模式支持。这些模式语言相当强大,因此学习和实现起比较复杂。
(2)CSV没有任何模式,因此应用程序需要定义每行和每列的含义。如果应用程序更改添加新的行或列,则必须手动处理该更改。其实CSV也算是一个相当模糊的格式(如果一个值包含逗号或换行符,会发生什么)。尽管其转义规则已经被正式指定,但并不是所有的解析器都能正确实现它们。
XML 模式通常被称为 XML 模式定义(XSD)。它被用来描述和验证 XML 数据的结构和内容。XML 模式定义元素,属性和数据类型。
JSON 模式是一种基于 JSON 格式定义 JSON 数据结构的规范。