Agent-almanac adapt-architecture
git clone https://github.com/pjt222/agent-almanac
T=$(mktemp -d) && git clone --depth=1 https://github.com/pjt222/agent-almanac "$T" && mkdir -p ~/.claude/skills && cp -r "$T/i18n/zh-CN/skills/adapt-architecture" ~/.claude/skills/pjt222-agent-almanac-adapt-architecture-6bc196 && rm -rf "$T"
i18n/zh-CN/skills/adapt-architecture/SKILL.md架构适配
执行结构性蜕变——将系统架构从当前形态转变为目标形态,同时维持运行连续性。使用绞杀者无花果迁移、蛹化阶段和接口保持,确保系统在转型期间始终正常运行。
适用场景
- 形态评估(参见
)已将系统分类为 READYassess-form - 系统必须在不停机的情况下演进架构以满足新需求
- 从单体迁移到微服务(或反向迁移)
- 在依赖系统继续运行的同时替换核心子系统
- 在保持向后兼容的同时演进数据模型
- 任何必须渐进而非一步到位的架构变更
输入
- 必需:当前形态评估(来自
或等效分析)assess-form - 必需:目标架构(系统应当变成什么样)
- 必需:运行连续性要求(在转型过程中什么不能中断)
- 可选:可用的转型预算(时间、人力、算力)
- 可选:回滚要求(需要能够回退到多远?)
- 可选:并行运行时长(新旧系统同时运行多久)
步骤
第 1 步:设计转型蓝图
规划从当前形态到目标形态的蜕变路径。
- 将转型映射为一系列中间形态:
- 当前形态 → 中间形态 1 → ... → 目标形态
- 每个中间形态必须在运行上可行(能处理流量、通过测试)
- 任何中间形态都不应比当前形态更难维护
- 识别转型接缝:
- 当前形态可以在哪里"切割"以插入新架构?
- 自然接缝:现有接口、模块边界、数据分区
- 人工接缝:专门为实现切割而创建的接口(防腐蚀层)
- 选择蜕变模式:
- 绞杀者无花果:新系统围绕旧系统生长,逐步替换
- 蛹化:旧系统被包裹在新外壳中;在外壳保持外部接口的同时替换内部
- 萌芽:新系统与旧系统并行生长;流量逐步转移(参见
了解集群萌芽)scale-colony - 蜕变式迁移:按依赖顺序分阶段替换组件(先叶后根)
- 设计接口保持层:
- 外部消费者不得感受到中断
- API 版本控制、向后兼容的契约、适配器模式
- 保持层是临时脚手架——规划其移除
Metamorphosis Patterns: ┌───────────────┬───────────────────────────────────────────────────┐ │ Strangler Fig │ New code intercepts routes one by one; │ │ │ old code handles everything else until replaced │ │ │ ┌──────────┐ │ │ │ │ Old ████ │ → │ Old ██ New ██ │ → │ New ████ │ │ │ │ └──────────┘ │ ├───────────────┼───────────────────────────────────────────────────┤ │ Chrysalis │ Wrap old system in new interface; replace │ │ │ internals while external shell stays stable │ │ │ ┌──────────┐ ┌──[new]───┐ ┌──[new]───┐ │ │ │ │ old core │ → │ old core │ → │ new core │ │ │ │ └──────────┘ └──────────┘ └──────────┘ │ ├───────────────┼───────────────────────────────────────────────────┤ │ Budding │ New system runs in parallel; traffic shifts │ │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │ │ Old │ │ New │ → │ Old │ │ New │ │ │ │ │ 100% │ │ 0% │ │ 0% │ │ 100% │ │ │ │ └──────┘ └──────┘ └──────┘ └──────┘ │ └───────────────┴───────────────────────────────────────────────────┘
预期结果: 一份转型蓝图,展示中间形态、接缝、所选蜕变模式和接口保持策略。每个步骤都是具体且可测试的。
失败处理: 如果找不到干净的接缝,系统可能需要先进行初步解体(参见
dissolve-form)以创建接缝。如果中间形态在运行上不可行,则转型步骤太大——分解为更小的增量。
第 2 步:搭建脚手架
构建支持蜕变的临时基础设施。
- 创建防腐蚀层:
- 新旧系统之间的薄转换层
- 根据迁移状态将请求路由到适当的系统(新或旧)
- 在新旧数据表示之间进行格式转换
- 该层是保护转型的"茧"
- 搭建并行运行基础设施:
- 新旧系统必须能同时部署
- 功能开关控制哪个系统处理哪些流量
- 比较机制验证新旧系统产生等价结果
- 建立回滚检查点:
- 在每个中间形态,验证是否可以回滚到前一个形态
- 回滚必须比正向转型步骤更快
- 数据迁移必须可逆(或在过渡期间数据必须双写)
- 构建验证工具:
- 自动化测试在每个中间形态验证运行连续性
- 性能基准检测回归
- 数据完整性检查捕获迁移错误
预期结果: 脚手架基础设施(防腐蚀层、并行运行、回滚、验证)在任何转型开始之前就已就位。脚手架本身已经过测试和验证。
失败处理: 如果脚手架成本过高,可以简化:最小可行脚手架是一个功能开关和一个回滚程序。防腐蚀层和并行运行增加了安全性,但对于较小的转型并非总是必需的。
第 3 步:执行渐进式切换
将功能从旧形态增量迁移到新形态。
- 排列组件迁移顺序:
- 从耦合最松、风险最低的组件开始(建立信心)
- 向更关键、更紧密耦合的组件推进
- 将耦合最紧/最关键的组件留到最后(届时团队已有经验)
- 对每个组件: a. 在防腐蚀层后面实现新版本 b. 并行运行:新旧两者处理相同的输入 c. 比较输出——它们应该等价(或差异应是预期的并已记录) d. 确信后,将流量切换到新版本(功能开关翻转) e. 监控异常(切换后提高监控灵敏度) f. 经过稳定期后,下线该组件的旧版本
- 全程维持持续交付:
- 每次切换都是常规部署,不是特殊事件
- 系统始终处于已知、已测试、可运行的状态
- 如果切换引起问题,回滚到前一个状态(该状态仍然可运行)
预期结果: 功能逐组件迁移,每步都有验证。系统始终保持运行。每次切换都为下一次建立信心。
失败处理: 如果并行运行发现差异,说明新实现有 bug——在切换之前修复。如果切换导致性能下降,新组件可能需要优化,或防腐蚀层增加了过多开销。如果团队在迁移中途失去信心,暂停并稳定——处于已知状态的半迁移系统远好于仓促完成的全量迁移。
第 4 步:管理蛹化阶段
驾驭最脆弱的时期——系统处于新旧形态之间。
- 承认蛹化现实:
- 迁移期间,系统部分是旧的,部分是新的
- 这种混合状态本质上比任一纯粹状态更复杂
- 复杂度在迁移中点达到峰值,然后下降
- 蛹化纪律:
- 蛹化阶段不添加新功能(仅进行转型)
- 最少的外部变更(冻结非必要部署)
- 增加监控和值班覆盖
- 每日检查迁移进度和系统健康状况
- 中期蛹化评估:
- 在中途评估:目标形态仍然是正确的目标吗?
- 是否有任何变化(市场、需求、团队)影响了目标?
- 转型应该继续、暂停还是重新定向?
- 保护蛹化:
- 始终保持回滚路径畅通
- 彻底记录当前混合状态(未来的调试者会需要它)
- 抵制在迁移完成前"清理"临时脚手架的诱惑
预期结果: 蛹化阶段被作为一个刻意的、有时间限制的时期来管理,具有更高的纪律和监控。团队理解临时复杂性是安全转型的代价。
失败处理: 如果蛹化阶段拖延太久,混合状态就会变成新常态——这比新旧任一状态都更糟。设定时间限制。如果达到限制,要么加速剩余迁移,要么接受混合状态作为"新形态"并使其稳定。
第 5 步:完成蜕变并稳定
完成转型并移除脚手架。
- 最终切换:
- 将最后的组件迁移到新形态
- 针对完整的新系统运行全套验证
- 在等效生产负载下进行性能测试
- 移除脚手架:
- 下线防腐蚀层(不再需要)
- 移除与迁移相关的功能开关
- 清理并行运行基础设施
- 归档(不要删除)旧系统代码以供参考
- 蜕变后稳定化:
- 以新形态运行 2-4 周,增强监控
- 处理在真实条件下出现的任何问题
- 更新文档以反映新架构
- 回顾:
- 转型中什么做得好?
- 什么比预期更困难?
- 下次我们会有什么不同的做法?
- 更新团队的转型手册
预期结果: 转型完成。系统以新形态运行。脚手架已移除。文档已更新。团队已为未来的转型积累了经验。
失败处理: 如果新形态在切换后不稳定,维持回滚路径并继续稳定化。如果稳定化超过计划时间,可能是新架构存在设计问题——考虑是进行针对性修复还是对最有问题的组件进行部分回滚。
验证清单
- 转型蓝图展示了可行的中间形态
- 脚手架(防腐蚀层、回滚、验证工具)在迁移开始前已就位
- 组件按从最低到最高风险的顺序迁移
- 并行运行在每步验证等价性
- 蛹化阶段有时间限制且遵守功能冻结纪律
- 转型完成后所有脚手架已移除
- 蜕变后稳定期无严重问题
- 回顾总结了经验教训
常见问题
- 一步到位的迁移:试图一次性转型所有内容。这放弃了增量切换的安全性,最大化了影响范围。始终增量迁移
- 永久性脚手架:从不移除的防腐蚀层和功能开关会变成技术债务。将脚手架移除作为转型的一部分来规划,而非事后才考虑
- 蛹化否认:假装混合状态是正常的,会导致在不稳定基础上进行功能开发。承认蛹化阶段并执行其纪律
- 目标固着:过于执着目标架构,以至于忽略了更好替代方案的迹象。中期蛹化评估就是为此而存在的
- 转型疲劳:漫长的迁移会耗尽团队。保持每个转型步骤小到可以在数天而非数周内完成。庆祝里程碑以保持动力
相关技能
— 前置评估,确定系统是否准备好进行转型assess-form
— 对于过于僵化无法直接转型的系统;解体创建此处所需的接缝dissolve-form
— 当转型引入损害时的恢复技能repair-damage
— 表面适配,可能无需深层架构变更即可满足需求shift-camouflage
— 群体协调为分布式系统的转型排序提供参考coordinate-swarm
— 增长压力是架构适配的常见触发因素scale-colony
— GitOps 为渐进式切换提供部署基础设施implement-gitops-workflow
— 用于评估目标架构的互补审查技能review-software-architecture