绞杀者式迁移
用途:把遗留单体逐步替换成新架构,而不是一次性重写时查阅
定义
「定义」小节链接绞杀者模式(Strangler Fig Pattern,Martin Fowler 提出):在遗留系统外围建立新能力,通过路由层把功能逐块迁移到新实现,旧实现随流量减少而萎缩,最终下线。
核心机制是门面(Facade)+ 管道(Pipeline):门面接收所有请求并决定路由;管道负责鉴权、日志、灰度与切换。
为什么不用大爆炸重写
「为什么不用大爆炸重写」小节链接重写项目的典型失败模式:新系统永远追不上旧系统不断新增的需求;缺少旧系统的隐性知识(边界条件、历史数据怪癖);切换日成为全公司风险事件;周期越长,业务方信心越低。
绞杀者的优势:每次只切换一小块,可回滚、可对比、可持续交付业务需求。
实施步骤
「实施步骤」小节链接| 阶段 | 动作 | 关键控制 |
|---|---|---|
| 1 选点 | 按“变更频率高 + 边界清晰 + 价值可量化”选第一块 | 首战必须能短期见效 |
| 2 建门面 | 网关/路由层接管入口,默认全部转发旧系统 | 门面本身要极高可用 |
| 3 并行实现 | 新服务实现该功能,读旧数据或双写 | 数据归属先想清楚 |
| 4 影子验证 | 新系统只处理不生效,比对结果差异 | 覆盖真实流量分布 |
| 5 灰度切流 | 按用户/租户/比例逐步放量 | 每档有观察窗口与回滚阈值 |
| 6 数据迁移 | 回填历史 + 增量同步 + 对账 | 停写窗口与回滚路径 |
| 7 下线旧路径 | 删除旧代码与表 | 保留审计与恢复预案 |
三种迁移粒度
「三种迁移粒度」小节链接- 按功能页面/接口:最常用,风险低。
- 按租户/用户分片:适合 B 端系统,可用大客户验证。
- 按读写分离:先把读流量切到新模型(投影/搜索),写路径最后切。
双写与数据一致性
「双写与数据一致性」小节链接迁移期最常见的技术难点。要点:以旧库为准写入并异步同步到新(或反向),差异由对账发现;禁止两侧同时接受写;明确切换顺序“先停旧写 → 校验 → 开新写”,避免脑裂。
常见误区
「常见误区」小节链接| 误区 | 修正 |
|---|---|
| 门面层缺监控与回滚 | 门面是咽喉,必须可秒级切回旧路径 |
| 只做代码迁移不管数据归属 | 数据 owner 不明确会让迁移无限延长 |
| 一次切 100% | 灰度阶梯 + 观察窗口,任何异常自动回滚 |
| 并行期无差异比对 | 影子比对与对账是“新系统正确”的唯一证据 |
| 旧代码长期不下线 | 设定下线里程碑,否则维护双份成本吞掉收益 |
| 首战选最难模块 | 先做边界清晰、价值可见的一块,建立方法与信心 |
延伸阅读
「延伸阅读」小节链接- Martin Fowler 关于 Strangler Application 的原始论述
- Martin Fowler《重构》(并行变更 Parallel Change 章节)
- Sam Newman《Monolith to Microservices》(系统的绞杀与数据迁移路径)