知识卡片

滚动升级要求编码格式同时具备向后与向前兼容

普通读书笔记卡

内容

应用改功能几乎总意味着改数据格式,但代码变更在大型系统里很少能瞬间完成——服务端 应用常用滚动升级(一次只把新版本部署到少数节点,验证正常后逐步推开,好处是不中断 服务、支持频繁发布、能在影响大量用户前发现故障并回滚),客户端应用的升级节奏更是 完全取决于用户意愿。这意味着新旧版本的代码、新旧格式的数据会在系统里长期共存, 必须同时满足两个方向的兼容性:向后兼容(新代码能读旧数据)和向前兼容(旧代码能读 新数据)。这两者的实现难度不对称:向后兼容通常不难,因为新代码的作者写代码时当然 知道旧格式长什么样,最简单的办法就是保留处理旧格式的代码路径;向前兼容则更棘手, 因为旧版本的程序要去处理一种它自己还不知道的新格式,通常只能靠”忽略无法识别的部分” 这种防御性策略来应对,而不是真正理解新增的内容。理解这组不对称性,是评估任何编码 格式设计是否”够用”的基本标准——一个格式如果只考虑了向后兼容而没设计向前兼容的 路径(比如没有让旧代码能安全跳过未知字段的机制),在滚动升级场景下就会出问题。

参考来源

- 位置:《数据密集型应用系统设计》第四章《编码与演化》引言部分(源文件: _epub-src/ch4_split_000.html) - 结论依据:原文说明服务端应用常用滚动升级、客户端升级节奏不可控,导致新旧代码 和数据格式长期共存,因此需要向后兼容(新代码读旧数据)和向前兼容(旧代码读新 数据),并指出向后兼容通常不难而向前兼容更棘手,直接支撑本卡片结论。 - 原始内容:对于服务端应用程序,可能需要执行滚动升级……新旧版本的代码,以及新旧 数据格式可能会在系统中同时共处。系统想要继续顺利运行,就需要保持双向兼容性: 向后兼容——新代码可以读旧数据;向前兼容——旧代码可以读新数据……向前兼容性可能会 更棘手,因为旧版的程序需要忽略新版数据格式中新增的部分。