路由切片,而不是整个系统
一次性重写会把风险集中到一个发布中。绞杀者模式每次把一个切片移到路由层之后。新切片处理真实流量,与旧行为比较,失败时可以路由回去。旧系统仍对尚未迁移的切片保持权威。
/checkout/* -> new checkout service
/orders/* -> new orders service
/catalog/* -> legacy monolith (until migrated)
路由层可以是 API 网关、反向代理或功能开关。关键属性是路由可逆且可观测。没有回滚路径的切片,只是伪装成增量迁移的一次性发布。
数据才是难点
路由读流量容易,迁移写入和所有权则不是。过渡期两套系统可能都需要读同一份数据。共享数据库只能作为临时桥梁,必须有明确所有者和拆分计划。如果两边都写入,要定义谁是权威、变更如何传播。outbox 或变更数据捕获可以在不让两边都成为主库的情况下保持读模型新鲜。
下线旧系统
流量归零不代表迁移完成。要停用旧路由、吊销其凭证、按策略删除或归档数据,并移除路由例外。以“以防万一”为由保留的遗留系统会继续花钱、接收补丁并构成安全风险。
何时使用
当遗留系统太大或风险太高、无法整体重写,而业务在过渡期又需要持续交付时,使用绞杀者模式。优点是有界风险和持续学习;代价是长期双轨运行、路由复杂度和数据核对。与重写相比,它达到整洁架构更慢,但不太可能一次全盘失败。