兼容性关乎混合版本
滚动发布期间,新旧实例同时运行;移动客户端可能使用某个 API 版本数月;事件重放可能处理多年前写入的记录。向后兼容确保新代码能处理旧形状,旧代码能承受新形状,具体方向取决于需要。
type User = { id: string; name: string; avatarUrl?: string };
function render(user: User) {
return user.avatarUrl ?? '/default-avatar.png';
}
可选字段和默认值让旧负载仍可渲染。删除 name 或把 id 改成数字,会破坏现有客户端。
增加、弃用、移除
优先做增量变更:新的可选字段、新端点、新事件类型。弃用要公布时间线、统计使用量,并在旧版本不再使用后才移除。破坏性变更应引入新版本,并在明确期限内保留旧版本。不要在同一名称下悄悄改变语义。
测试旧形状
契约测试、重放测试和金标准夹具都应包含历史负载。只使用最新形状的测试会漏掉兼容性破坏。对数据库,用旧应用代码读取迁移后的模式做测试;对事件,保留旧事语料并验证 upcasting。
何时使用
当存在独立客户端、滚动部署或长期数据时,使用向后兼容。优点是安全演进和可回滚;代价是版本管理纪律和维护旧版本的成本。与协调式一次性升级相比,兼容策略移除旧路径更慢,但避免了同步停机。