知识卡片

模式作为解码前提本身就是永不过时的强制文档

普通读书笔记卡

内容

Protocol Buffers、Thrift、Avro这类基于模式驱动的二进制编码,相比各种”二进制JSON” 变体(MessagePack等)和手写文档,有几个容易被低估的优点。首先是更紧凑:因为有 模式约束,编码数据可以省略字段名(用标签号或严格顺序代替),二进制JSON变体没有 模式约束、必须在数据里带上完整字段名,反而更占空间。其次是一个容易被忽视但很有 价值的属性:模式本身就是一种永不过时的文档——因为模式是解码数据的必要前提(没有 它连数据都读不出来),它天然会被持续维护和更新,不像人工手写的接口文档那样容易 因为疏于更新而与代码实际行为脱节。再次,维护一个模式版本的数据库,能让团队在真正 部署任何改动之前,就先检查这次模式改动是否满足向前/向后兼容——把兼容性问题从 “上线后才发现”提前到”上线前就能验证”。最后,对静态类型语言用户来说,从模式生成 代码能带来编译期类型检查和IDE自动补全的好处。这四点叠加起来说明:采用模式驱动的 编码格式换来的好处,不只是省字节这么简单,本质上是获得了和无模式/读时模式方案 (如JSON数据库)同等的演进灵活性,同时还多出了更强的数据正确性保证和更好的工具 支持——不是”灵活性 vs 保证性”的二选一,而是能兼得的组合。

参考来源

- 位置:《数据密集型应用系统设计》第四章《编码与演化》"模式的优点"(源文件: _epub-src/ch4_split_002.html) - 结论依据:原文列出模式驱动编码的优点:比二进制JSON变体更紧凑(省略字段名)、 模式作为解码必需前提因而始终保持最新(不像手动文档容易过时)、维护模式数据库 可在部署前检查兼容性、支持静态类型语言的代码生成,并总结模式演进能兼得灵活性 与更好的数据保证和工具,直接支撑本卡片结论。 - 原始内容:模式是一种有价值的文档形式,因为模式是解码所必需的,所以可以确定它是 最新的(而手动维护的文档可能很容易偏离现实)……总而言之,模式进化允许与JSON 数据库提供的无模式/读时模式相同的灵活性,同时还可以更好地保证数据和更好的工具。