标准答案
- 扩展阶段先新增可选字段、表列、索引或新接口,保持旧字段和旧行为继续可用。
- 迁移阶段让新旧代码按兼容规则读取,必要时双写或异步回填,并通过指标确认新路径已稳定。
- 收缩阶段在所有消费者升级、历史数据完成迁移、回滚窗口结束后,再删除旧字段、旧接口和旧代码。
- 每一步都需要可观测性和回滚方案,尤其要区分“代码回滚”和“数据已经不可逆变化”的风险。
题目解析
生产环境通常会在一段时间内同时运行新旧实例,异步任务和外部消费者也可能滞后。直接改字段含义或删除列,很容易让未升级方崩溃。
双写并不意味着永久保留两份事实来源。必须明确主字段、校验方式和结束条件,否则会演变成长期数据不一致。
常见误区
- 先删除字段再发新代码,假设发布瞬间所有实例都会切换。
- 双写后没有比对和收敛计划,两个字段长期互相覆盖。
- 数据库迁移不可回滚,却没有在发布前做备份和风险隔离。