架构迁移
架构迁移需要维持新旧系统的契约兼容。本文负责兼容清单、数据切换和退出条件。这些内容用于资深后端岗位的项目追问。
1. 面试核心
先记住这几条,再读正文- 兼容阶段。 扩展、迁移、收缩三个阶段维持新旧版本兼容。卡 · 综合题
- 迁移进度。 迁移状态记录批次进度、校验结果和回退边界。
- 并发写入。 回填与增量写入需共享顺序依据,防止旧值覆盖新值。卡 · 回填与增量写入
- 旧路径退出。 旧消费者归零、数据校验完成后才能收缩旧路径。
2. 兼容面
兼容清单覆盖结构和行为。字段名保持不变时,金额舍入改变也会影响调用方。
| 兼容面 | 核验内容 |
|---|---|
| API | 请求、响应、错误码、认证和默认值 |
| 事件 | schema、顺序和投递语义 |
| 数据 | 表结构、索引和读写格式 |
| 运行 | 配置、权限、告警和审计字段 |
| 消费者 | SDK、批处理、报表和运维工具 |
每项登记所有者、消费者和兼容期限。消费者不清楚时,先补访问日志或登记机制。
3. 扩展、迁移、收缩
- 扩展:增加新字段或接口,保留旧读写能力。
- 迁移:回填数据,逐批切换消费者。
- 收缩:确认旧路径停用,再删除兼容逻辑。
重命名列时,可以先新增目标列。过渡代码兼容两种结构,并明确权威写入方。回填完成后切换读取,最后删除旧列。直接改名会使滚动发布中的旧实例报错。
跨系统同步需处理部分失败。Transactional Outbox 与 CDC负责可靠事件与增量同步机制。
4. 迁移状态
迁移以租户、分区或业务流程为单位记录状态。
待迁移 → 回填中 → 增量追平 → 影子验证 → 灰度 → 已切换 → 已关闭回退
状态转换需幂等,并保存检查点。记录还需包含数据范围、校验结果和操作者。中断后从已确认位置恢复。
批次大小取决于故障范围和恢复耗时。低风险批次通过后,再覆盖高价值对象。每批结束后保留明确的观察窗口。
5. 灰度规则
稳定分组使同一对象持续进入选定路径。具体分桶和指标比较见灰度发布。
迁移计划还需将路由组与数据状态对应起来。数据尚未追平的租户继续使用旧路径。每次切换记录负责人、检查点和回退位置。
6. 影子流量与双读
双读由旧路径返回结果,新路径用于对照。比较器过滤随机 ID、时间戳等可接受差异。金额、权限和状态差异按业务规则判断。
影子请求只执行无副作用计算。它们使用独立标识,并计入下游容量。写入并发与事务语义需用真实小流量验证。
7. 回滚与向前修复
回滚恢复旧路径,向前修复处理不可逆变化。上线前分别核验:
- 旧代码能够读取新数据。
- 已发送事件有明确的处理方。
- 在途流程有稳定的版本归属。
- 切回后仍能阻止重复扣款或通知。
数据已经不可逆转换时,用开关关闭风险路径。随后通过兼容读取、对账或补偿修复结果。回滚阈值、权限和耗时都应提前演练。
8. 退出条件
迁移退出以清单验收:
- 全部目标对象进入新路径。
- 技术与业务指标达到预设目标。
- 回填完成,数据差异有明确处理结果。
- 旧接口、字段和事件的消费者归零。
- 文档、告警和运行责任完成交接。
- 回退窗口关闭,旧资源与临时开关完成删除。
每项指定负责人和证据。观察期需覆盖低频批处理与报表周期。删除旧路径时,先关闭入口并观察,再删除存储。
9. 迁移复盘
复盘比较迁移前后的延迟、成本和故障范围。也要检查发布速度是否达到原定目标。目标未达成时,重新核验假设和实施边界。
兼容层与同步任务有明确的保留期限。关闭项目时核对清理结果,避免长期双轨维护。
10. 回填与增量写入
回填和在线更新会竞争同一条记录。例如回填先读到余额 100,在线请求随后改为 120。若回填最后无条件写入,新库会退回 100。
迁移方案需建立快照与变更日志的连续位置。先保存可恢复的日志位置,再按工具语义读取快照。回填期间持续保留增量,随后按顺序追平。写入端也可按源端行版本拒绝过期覆盖。
切换前核对日志延迟和业务字段。行数相同仍需检查金额、状态等业务不变量。验证范围应覆盖回填期间的更新与删除。
11 · 面试题卡片
11.1 一个核心接口怎样做到无停机迁移并保留回退能力
出现公司:阿里巴巴
题型:综合题
考察重点
- 理解API、事件、数据和行为兼容。
- 理解分批状态、影子验证和灰度阈值。
- 理解数据回退、向前修复与退出条件。
参考回答
无停机迁移依靠兼容扩展、分批切换和延后收缩。
先列出 API、数据和事件消费者。每批保存回填进度与增量位置。灰度前核对数据,再按稳定对象分组放量。
回退方案同时覆盖路由、旧代码读新数据和在途流程。不可逆变化使用向前修复。指标稳定、旧消费者归零后关闭回退窗口。最后删除旧路径并核验迁移目标。
11.2 回填期间发生在线更新,怎样避免旧值覆盖新值?
出现公司:暂无已核验的公开来源(本站自测)
考察重点:快照位置、增量顺序与数据校验。
相关内容:回填与增量写入。
参考回答
需要将快照和增量日志衔接到同一顺序。
回填先恢复基线,再按源端顺序追平变更。源端行版本也可用于拒绝过期覆盖。
切换依据包括日志追平和业务字段对账。仅比较行数会漏掉金额更新与状态差异。