← 中文资源

简体中文版本

向后兼容

向后兼容关注混合版本共存:新代码能处理旧数据形状,旧代码能承受新形状,从而支持滚动发布和长期客户端。

阅读英文原文

兼容性关乎混合版本

滚动发布期间,新旧实例同时运行;移动客户端可能使用某个 API 版本数月;事件重放可能处理多年前写入的记录。向后兼容确保新代码能处理旧形状,旧代码能承受新形状,具体方向取决于需要。

type User = { id: string; name: string; avatarUrl?: string };

function render(user: User) {
  return user.avatarUrl ?? '/default-avatar.png';
}

可选字段和默认值让旧负载仍可渲染。删除 name 或把 id 改成数字,会破坏现有客户端。

增加、弃用、移除

优先做增量变更:新的可选字段、新端点、新事件类型。弃用要公布时间线、统计使用量,并在旧版本不再使用后才移除。破坏性变更应引入新版本,并在明确期限内保留旧版本。不要在同一名称下悄悄改变语义。

测试旧形状

契约测试、重放测试和金标准夹具都应包含历史负载。只使用最新形状的测试会漏掉兼容性破坏。对数据库,用旧应用代码读取迁移后的模式做测试;对事件,保留旧事语料并验证 upcasting。

何时使用

当存在独立客户端、滚动部署或长期数据时,使用向后兼容。优点是安全演进和可回滚;代价是版本管理纪律和维护旧版本的成本。与协调式一次性升级相比,兼容策略移除旧路径更慢,但避免了同步停机。