DDIA(数据密集型应用系统设计) 读书笔记-第四章

981 阅读3分钟

image.png

兼容性

兼容性这块儿,个人理解:向前兼容是旧版本服务可以读取新版本服务写的新数据,向后兼容则是新版本服务可以读取旧版本服务写的老数据。实质上是数据模式变化(比如新插入一列)和服务变化(服务做了升级,业务逻辑有新的处理)。任何编码格式都要解决其中一种或者两种的兼容性问题。

数据编码格式

数据表现形式

  • 数据存储在内存。就有对象,结构体,列表,数组等。同时对访问和操作做了优化
  • 数据在文件或网络中传输。就有字节序列

内存---->字节序列====序列化或者编码

字节序列---->内存====反序列化或解码

数据交互格式

主要分为语言自身的格式以及标准化编码和基于模式的二进制编码

  • 语言自身格式

    这个容易理解,很多开发语言都有内置的编解码工具,比如java有 Serializable 。这种编码格式用起来方便,但是缺点多,不能跨语言传输,效率低,安全问题等等

  • 标准化编码

    Json和XML以及CSV。传输过程中是序列化为二进制

  • 基于模式的二进制编码

    书中提到了Thrift,PB,AVRO这三个。简而言之,前两个模式是固定,也就是说提前预置好的编解码格式,不能在运行中兼容其他模式,只能满足向后兼容,也就是说数据模式不变,服务来回更新。Thrift提供了两种编码方式,差别在于CompactProtocol对于字节进行了压缩,将高位的0全部干掉。PB用的方式和Thrift的CompactProtocol一样,节省空间。AVRO比较特殊,它提供了读和写两种模式。这两种模式是互相解耦的可以按照自己需要的模式进行读和写。因此它是支持向前向后兼容。向前兼容其实就是新模式作为写,旧模式作为读;向后兼容则是新模式作为读,旧模式作为写。

数据流模式

  • 基于数据库的数据流

    数据库的数据模式向前向后兼容都支持。这种支持方式主要是靠服务来保证的。同时由于线上环境进行模式迁移(比如相同表之间结构的变化)成本较高,可以认为模式是不变。另外数据库进行归档存储时候模式也会存储,这个很好理解,任何一个数据库都不会只要数据不要格式进行归档

  • 基于服务的数据流

    web服务这里面主要有提到了 RestFull Soap rpc 这三个。restfull主要是Http的一种理念,后两者是实际传输的模式

  • 基于消息传递的数据流

    消息代理,作者罗列了一大堆特点,其实说的就是MQ。

    Actor框架,实质就是消息代理和单个Actor节点的融合