← 中文资源

简体中文版本

版本偏斜:混跑多个版本而不出错

版本偏斜是发布过程中的常态:新旧代码并行运行。为它做设计,才能避免静默不兼容与失败的回滚。

阅读英文原文

混合版本才是常态

滚动发布期间,一部分实例运行旧构建,一部分运行新构建;跨区域故障转移时,新控制面可能与旧节点配合;移动客户端要花几个月才完成升级。版本偏斜不是需要消灭的异常,而是任何分布式系统的稳定状态,必须被显式设计。

兼容窗口

每个接口都需要明确的兼容窗口:允许多少个版本共存、共存多久。例如 Kubernetes 会发布偏斜策略,规定控制面与节点版本可以相差多少。内部 API 同样需要把这件事写下来,因为一旦出现两个团队,「我们总是一起发布」就不再成立。

数据才是难点

代码通常可以两个版本同时跑,数据不行。新版本写入新列、新枚举值或新消息字段,会产生旧版本无法理解的状态。采用扩展—收缩式迁移:先新增,再部署读取方,回填数据,最后在后续版本中删除。例如,写入旧代码会拒绝的状态值,会把一次回滚变成一次故障。

测试偏斜

测试你真正支持的组合:新对旧、旧对新,以及两者对共享状态。契约测试能发现协议层破坏,回放录制流量能发现行为层破坏。把偏斜场景加入发布检查清单,因为默认测试套件只会验证版本一致的组合。

与原子升级的对比

原子升级通过一次性切换避免偏斜,代价是停机或复杂的切换流程。增量升级接受偏斜以保持可用性。只有把兼容性验证清楚而不是假设成立,并且用新版本写入的数据验证回滚,这笔交易才安全。