绞杀者模式
绞杀者模式通过逐步替换业务能力迁移遗留系统。本文讲解流量路由、契约兼容、数据切换和回退。
1. 面试核心
先记住这几条,再读正文- 渐进迁移。 绞杀者模式让新旧实现并存,并按业务路径逐步迁移。卡 · 综合题
- 契约演进。 expand–migrate–contract 依次扩展契约、迁移调用方和移除旧版本。
- 写入权切换。 数据切换用明确写入权和同步位置衔接全量与增量。卡 · 写入权交接与增量位置
- 流量验证。 影子流量验证新旧结果,灰度流量验证真实业务路径。
- 回退与退出。 回退同时恢复流量与数据兼容,旧路径退出后迁移结束。
2. 迁移切口
第一条路径应边界清楚、调用方可枚举、影响可控。收益需要可测量,例如发布耗时或独立扩容效果。
切口可以是一组 URL、一个租户或一类后台任务。计划明确新旧责任、依赖和数据验证方式。成功指标与回退条件应在上线前确定。
3. 路由入口
代理、网关或 facade 按请求特征选择新旧实现。稳定入口减少调用方同时改造的成本。路由规则需要记录版本,并支持快速恢复。
代理本身需要容量和高可用设计。直连旧系统的后台任务也要纳入迁移清单。外部模型的转换见限界上下文。
4. 契约演进
契约变更分为三步:
- 新系统同时兼容旧字段与新字段。
- 调用方分批迁移,记录版本使用情况。
- 旧消费者退出后,删除兼容结构。
新增字段需有默认语义。枚举扩展需测试旧消费者的处理行为。数据库变更也遵循加列、回填、切换和删列的顺序。
5. 数据迁移
同一业务数据在迁移期间应有明确写入方。全量回填负责已有数据,增量同步负责持续变化。CDC 的交付边界见Transactional Outbox 与 CDC。
回填需对齐主键、金额单位和状态含义。每批保存范围、进度和校验结果。重复回放通过幂等处理,差异进入对账任务。
5.1 写入权交接与增量位置
应用双写新旧库时,两次提交有独立失败窗口。单侧成功会让回退缺少完整数据。
一种可控方案是在切换窗口暂停该批业务写入。旧库完成在途事务后,记录最后同步位置。新库追到该位置并通过校验,再接管写入。后台任务和回调也要服从同一写入权。
切换后若仍需回退,应准备反向同步。旧库需能解释新状态,并追平新写入。不可逆数据变更应安排在回退窗口关闭后。
6. 影子流量
影子流量复制真实请求,但用户仍接收旧路径响应。新路径可比较查询、计算和规则结果。
扣款、通知和消息发布等副作用应被隔离。时间戳、随机 ID 等差异需规范化后比较。真实写竞争与下游反馈仍需灰度验证。
7. 灰度发布
灰度可按租户、地域或业务键分桶。同一业务流程保持路由稳定,避免步骤在新旧系统间跳转。
每批观察成功率、延迟和数据差异。消息积压、资源余量和人工处理量也需检查。扩大范围应满足既定样本量与观察期。
8. 回退
路由回退恢复请求入口。数据回退还需处理新路径产生的状态。旧实现应能读取新数据,未完成流程也需明确接手方。
回退演练验证流量、数据和依赖恢复时间。已发送事件按业务语义继续处理或补偿。不可逆变化采用向前修复。
9. 退出条件
旧路径退出前需要满足以下条件:
- 目标流量已稳定运行约定周期。
- 数据差异已修复或有明确解释。
- 旧接口、事件和表已无消费者。
- 告警、运行手册和维护责任已转交。
- 回退窗口已关闭,旧资源可以下线。
长期保留双轨会持续增加兼容和同步成本。
10 · 面试题卡片
10.1 怎样把一个遗留单体逐步迁移为新服务
出现公司:阿里巴巴
题型:综合题
考察重点
- 业务切口、路由缝隙和防腐层。
- 契约兼容、数据所有权和分批校验。
- 灰度、回退和旧路径退出条件。
参考回答
遗留系统可通过稳定入口逐条迁移业务路径。
候选能力需要边界清楚,收益可测。契约先扩展兼容,再迁移调用方,最后删除旧版本。数据以唯一写入方和可核对的同步位置衔接。
影子流量比较结果,灰度承接真实业务。回退既要恢复路由,也要保证旧系统理解新数据。稳定观察、数据校验和旧消费者退出后,才能删除旧路径。
10.2 新旧系统切换写入权时,怎样避免漏数据并保留回退能力?
出现公司:暂无已核验的公开来源(本站自测)
考察重点:在途事务、同步位置与反向兼容。
相关内容:写入权交接与增量位置。
参考回答
切换需要把旧侧的最后写入与新侧接管衔接起来。
可暂停目标范围写入,并等待在途事务结束。新侧追平记录的位置并校验后,再开放写入。回退还需旧侧追平新写入,并支持新数据格式。