【Day 11】可修改性战术:遗留单体系统向微服务演进
一、题目还原
某大型国有银行的核心业务系统始建于2005年,采用J2EE + EJB + Oracle的单体分层架构,承载着存款、贷款、账户、核算等核心业务,日均交易量约800万笔。随着互联网金融业务的快速发展,该系统暴露出以下问题:
(1) 系统代码规模超过800万行,模块间耦合严重,一次修改平均影响12个模块,新增一个产品需求平均需要3个月;
(2) 系统采用整体打包发布,每周只能发布一次,每次发布需停机30分钟,无法支撑快速迭代;
(3) 核心交易时段CPU使用率长期超过85%,无法通过水平扩展分摊压力;
(4) 大量核心业务逻辑仍运行在存储过程(PL/SQL)中,开发人员流失严重,维护成本极高;
(5) 监管要求全链路审计、灰度发布验证新功能,且改造期间业务不允许中断(零停机要求)。
为此,银行决定启动核心系统向微服务架构的渐进式演进项目。项目组提出了"绞杀者模式(Strangler Fig)+ 防腐层(Anti-Corruption Layer)"的改造路线。
【Q1】(8分) 请从可修改性质量属性角度,分析该遗留系统当前架构存在的主要问题,并说明可修改性战术中的"局部化修改"和"防止连锁反应"在该场景中的具体含义。
【Q2】(9分) 结合题目背景,说明为什么必须采用"绞杀者模式"而不是"Big Bang(一次性重写)"方式,并描述绞杀者模式在该银行场景下的分阶段实施方案。
【Q3】(8分) 在渐进式改造过程中,新旧系统需要并行运行并共享数据。请说明防腐层(ACL)的作用与设计要点,并分析新老系统数据双写/同步阶段可能出现的风险及应对措施。
二、考点分析
| 项目 | 内容 |
|---|---|
| 核心考点 | 可修改性质量属性战术 + 遗留系统演进策略(绞杀者模式 + 防腐层) |
| 所属章节 | 软件架构设计------质量属性与战术;架构演化与维护 |
| 对应模板 | 模板二:质量属性与战术分析(可修改性)+ 架构演化策略应用 |
| 本题难度 | ★★★★★(高频+综合,微服务迁移是论文与案例双重热点) |
三、标准答案(采分点格式)
【Q1】遗留架构的可修改性分析与战术含义(8分)
(1)当前架构的可修改性缺陷(4分,每点1分):
① 变更范围(Scope)大:单体分层架构下模块间紧耦合,一次修改平均影响12个模块,修改一个功能需连锁改动多个模块(对应需求1)。
② 变更成本(Cost)高:新增一个产品需求需3个月,且大量业务逻辑沉淀在存储过程中,人员流失导致知识断层,维护成本极高(对应需求1、4)。
③ 变更影响(Impact)难以控制:整体打包发布+每周一次+停机30分钟,任何小改动都可能引发全系统回归风险,无法灰度验证(对应需求2、5)。
④ 缺乏独立演进能力:整体部署、整体扩展,无法针对高负载模块单独优化与水平扩展(对应需求3)。
(2)可修改性战术在本场景的含义(4分):
① 局部化修改(Localize Modification)(2分):通过高内聚、模块化、抽象层等手段,将修改限制在单一模块内部。在演进场景中具体表现为:按业务领域(存款/贷款/账户/核算)将系统拆分为边界清晰的微服务,每个服务独立修改、独立部署,使"修改一个功能只影响一个服务"。
② 防止连锁反应(Prevent Ripple Effects) (2分):通过信息隐藏、接口稳定性(API版本管理)、中介者等战术,切断修改在模块间的传播路径。在演进场景中具体表现为:新老系统之间通过防腐层(ACL)隔离领域模型差异,通过消息队列/API网关等中介者解耦调用关系,保证老系统内部改动不会波及新系统,反之亦然。
【Q2】为什么用绞杀者模式及分阶段实施方案(9分)
(1)必须采用绞杀者模式的原因(4分):
① 风险可控:Big Bang一次性重写风险过高------整个系统同时切换,出现故障难以定位排查;而银行核心系统业务连续性要求极高(对应需求5,业务不允许中断)。
② 周期过长:800万行代码+存储过程逻辑,一次性重写周期可能长达3~5年,长时间无法上线,业务需求无法响应。
③ 反馈滞后:Big Bang开发很久才看到结果,方向可能偏离实际业务需求。
④ 知识丢失:旧系统承载大量隐性业务规则和多年修复经验,渐进式迁移可在迁移过程中边梳理边沉淀,避免知识断层。
(记忆口诀:风险高、周期长、反馈迟、知识丢)
(2)绞杀者模式分阶段实施方案(5分):
Phase 1(识别与路由): 在系统入口(ESB/API网关/负载均衡)部署路由层,新老系统并行运行;路由规则决定哪些请求转发到新服务、哪些继续走老系统。
Phase 2(边缘模块先行): 从耦合度低、业务相对独立的边缘模块(如对账单查询、利率查询、报表服务)开始改造,优先将"读多写少"的查询类功能迁移到新服务,验证技术栈与流程。
Phase 3(核心模块渐进替换): 逐步将账户管理、存款、贷款等核心模块按业务域迁移,每一批迁移后通过灰度发布+全链路对账验证,稳定后再迁移下一批。
Phase 4(数据同步与双写): 迁移期间新老系统数据库通过Canal/Debezium等工具进行双向数据同步,保证两侧数据一致。
Phase 5(下线老系统): 全部功能迁移完成且稳定运行后,将老系统流量清零、数据归档、正式下线。
(关键得分点:入口路由→边缘先行→核心渐进→数据同步→整体下线,且强调每阶段"保持系统可运行")
【Q3】防腐层的作用与双写风险应对(8分)
(1)防腐层(ACL)的作用与设计要点(4分):
作用(2分): 防腐层是位于新系统与遗留系统之间的转换与隔离层,负责把遗留系统的数据模型、接口协议转换为新系统期望的领域模型,防止遗留系统的"坏味道"(过时模型、混乱协议)污染新系统,实现新老系统的解耦与共存。
设计要点(2分):
① 模型转换 :在新系统边界定义独立的领域模型,ACL负责新旧模型的映射翻译,新系统不直接依赖老系统数据结构;
② 接口适配 :将老系统的存储过程、遗留API封装为符合新系统规范的REST/gRPC服务,隔离技术差异;
③ 单向依赖 :新系统依赖ACL,ACL依赖老系统------保证依赖方向可控,老系统的变更被限制在ACL内部消化;
④ 独立演进:ACL本身独立部署、独立版本管理,可随迁移进度逐步收缩,最终在老系统下线时一并移除。
(2)数据双写/同步阶段的风险及应对(4分):
| 风险 | 应对措施 |
|---|---|
| 数据不一致(双写失败、同步延迟导致两侧数据不同) | 采用双写+异步同步+对账机制:先写主库,通过Canal/Debezium捕获Binlog增量同步;每日定时全量对账,差异数据自动或人工修复 |
| 写放大与性能下降 | 双写改造为"单写+同步":新服务写入后同步到老库(或反之),降低双写复杂度;同步采用批量+削峰 |
| 切换期读写路由错乱(同一笔交易分别命中新老系统) | 通过灰度路由+业务主键维度(如按客户号哈希)固定路由规则,保证同一客户同一时段只路由到一个系统 |
| 回滚困难 | 保留老系统完整数据与代码版本,设定回滚预案;切换不成功的模块可立即回切到老系统,待修复后再切换 |
四、评分要点
必答采分点(拿满基础分):
- Q1:从"变更范围/变更成本/变更影响"三个度量维度描述可修改性问题(各1分)+ 两个战术名称准确(2分);
- Q2:Big Bang四条反对理由至少答出3条(3分)+ 绞杀者阶段划分完整("路由→边缘→核心→同步→下线"缺一不可,5分);
- Q3:ACL定义(隔离+转换,2分)+ 设计要点2条以上(2分)+ 双写风险至少2条及对应措施(4分)。
加分项(拉开差距):
- 点名"绞杀者模式=Strangler Fig"并说明其命名由来(像藤蔓缠绕绞杀宿主树,渐进替换);
- 结合银行场景强调"零停机、监管审计、灰度发布"等特殊约束;
- 提及具体工具(Canal/Debezium、API网关、ESB);
- Q2/Q3中出现"每阶段保持系统可运行"的重构核心原则。
常见失分点:
- 把绞杀者模式写成"一次性重写"或"直接淘汰老系统";
- 混淆防腐层与网关(网关管路由转发,防腐层管模型隔离转换);
- 只答战术名称不结合案例场景展开,空洞无物。
五、扩展知识点
1. 关联《易混淆对照表》: SOA vs 微服务------SOA粗粒度+ESB集中治理,微服务细粒度+去中心化;演进改造中"新系统用微服务、老系统通过ESB/ACL接入"正是混合过渡的典型形态。
2. 关联《遗留系统处理四策略》(09-架构演化和维护): 改造(Transform,绞杀者模式属渐进重写)/ 集成(Integrate,API封装)/ 继承(Evolve,增量升级)/ 淘汰(Retire)。本题是"改造为主、集成为辅"的组合------判断口诀:有业务价值→改造/集成/继承;无价值→淘汰;风险高→选渐进式。
3. 关联《可修改性战术速查表》(07-质量属性与架构评估): 局部化修改(高内聚/关注点分离/模块化/抽象层)、防止连锁反应(信息隐藏/接口稳定性/中介者/桥接)、推迟绑定(运行时注册/配置/多态/IoC)。微服务本身即"模块化+独立部署"战术的极致体现。
4. 关联《微服务专题突破》: 服务拆分用DDD限界上下文(每个BC对应一个微服务);迁移期分布式事务可参考 Seata AT(强一致核心链路)+ 本地消息表/MQ(最终一致外围链路)方案------与本题"双写+对账"思路一致。
5. 关联《答题模板》: 本题是"模板二(质量属性与战术分析)"的典型应用:遇到"分析某质量属性问题/战术"类题目,一律按【定义→度量维度→场景6元素→战术列表→结合案例】五步作答。
六、今日金句
"遗留系统演进的核心原则是'保持系统可运行'------用绞杀者模式渐进替换,用防腐层隔离新旧,每次重构完成后系统仍能正常上线;重构不重写,渐进式迁移比Big Bang重写安全十倍。"
(考试原话级表述,可直接用于案例题结论段或论文总结段。)