跳到主要内容
约 4 分钟2 张卡

绞杀者模式

绞杀者模式通过逐步替换业务能力迁移遗留系统。本文讲解流量路由、契约兼容、数据切换和回退。

1. 面试核心​

先记住这几条,再读正文
  • 渐进迁移。 绞杀者模式让新旧实现并存,并按业务路径逐步迁移。卡 · 综合题
  • 契约演进。 expand–migrate–contract 依次扩展契约、迁移调用方和移除旧版本。
  • 写入权切换。 数据切换用明确写入权和同步位置衔接全量与增量。卡 · 写入权交接与增量位置
  • 流量验证。 影子流量验证新旧结果,灰度流量验证真实业务路径。
  • 回退与退出。 回退同时恢复流量与数据兼容,旧路径退出后迁移结束。

2. 迁移切口​

第一条路径应边界清楚、调用方可枚举、影响可控。收益需要可测量,例如发布耗时或独立扩容效果。

切口可以是一组 URL、一个租户或一类后台任务。计划明确新旧责任、依赖和数据验证方式。成功指标与回退条件应在上线前确定。

3. 路由入口​

代理、网关或 facade 按请求特征选择新旧实现。稳定入口减少调用方同时改造的成本。路由规则需要记录版本,并支持快速恢复。

代理本身需要容量和高可用设计。直连旧系统的后台任务也要纳入迁移清单。外部模型的转换见限界上下文。

4. 契约演进​

契约变更分为三步:

  1. 新系统同时兼容旧字段与新字段。
  2. 调用方分批迁移,记录版本使用情况。
  3. 旧消费者退出后,删除兼容结构。

新增字段需有默认语义。枚举扩展需测试旧消费者的处理行为。数据库变更也遵循加列、回填、切换和删列的顺序。

5. 数据迁移​

同一业务数据在迁移期间应有明确写入方。全量回填负责已有数据,增量同步负责持续变化。CDC 的交付边界见Transactional Outbox 与 CDC。

回填需对齐主键、金额单位和状态含义。每批保存范围、进度和校验结果。重复回放通过幂等处理,差异进入对账任务。

5.1 写入权交接与增量位置​

应用双写新旧库时,两次提交有独立失败窗口。单侧成功会让回退缺少完整数据。

一种可控方案是在切换窗口暂停该批业务写入。旧库完成在途事务后,记录最后同步位置。新库追到该位置并通过校验,再接管写入。后台任务和回调也要服从同一写入权。

切换后若仍需回退,应准备反向同步。旧库需能解释新状态,并追平新写入。不可逆数据变更应安排在回退窗口关闭后。

6. 影子流量​

影子流量复制真实请求,但用户仍接收旧路径响应。新路径可比较查询、计算和规则结果。

扣款、通知和消息发布等副作用应被隔离。时间戳、随机 ID 等差异需规范化后比较。真实写竞争与下游反馈仍需灰度验证。

7. 灰度发布​

灰度可按租户、地域或业务键分桶。同一业务流程保持路由稳定,避免步骤在新旧系统间跳转。

每批观察成功率、延迟和数据差异。消息积压、资源余量和人工处理量也需检查。扩大范围应满足既定样本量与观察期。

8. 回退​

路由回退恢复请求入口。数据回退还需处理新路径产生的状态。旧实现应能读取新数据,未完成流程也需明确接手方。

回退演练验证流量、数据和依赖恢复时间。已发送事件按业务语义继续处理或补偿。不可逆变化采用向前修复。

9. 退出条件​

旧路径退出前需要满足以下条件:

  • 目标流量已稳定运行约定周期。
  • 数据差异已修复或有明确解释。
  • 旧接口、事件和表已无消费者。
  • 告警、运行手册和维护责任已转交。
  • 回退窗口已关闭,旧资源可以下线。

长期保留双轨会持续增加兼容和同步成本。

10 · 面试题卡片​

10.1 怎样把一个遗留单体逐步迁移为新服务​

出现公司:阿里巴巴

题型:综合题

考察重点

  • 业务切口、路由缝隙和防腐层。
  • 契约兼容、数据所有权和分批校验。
  • 灰度、回退和旧路径退出条件。

相关内容:迁移切口至退出条件。

参考回答

遗留系统可通过稳定入口逐条迁移业务路径。

候选能力需要边界清楚,收益可测。契约先扩展兼容,再迁移调用方,最后删除旧版本。数据以唯一写入方和可核对的同步位置衔接。

影子流量比较结果,灰度承接真实业务。回退既要恢复路由,也要保证旧系统理解新数据。稳定观察、数据校验和旧消费者退出后,才能删除旧路径。

10.2 新旧系统切换写入权时,怎样避免漏数据并保留回退能力?​

出现公司:暂无已核验的公开来源(本站自测)

考察重点:在途事务、同步位置与反向兼容。

相关内容:写入权交接与增量位置。

参考回答

切换需要把旧侧的最后写入与新侧接管衔接起来。

可暂停目标范围写入,并等待在途事务结束。新侧追平记录的位置并校验后,再开放写入。回退还需旧侧追平新写入,并支持新数据格式。

11. 参考资料​