【软件系统架构师案例分析每日一耕 Day 11】可修改性战术:遗留单体系统向微服务演进

【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增量同步;每日定时全量对账,差异数据自动或人工修复
写放大与性能下降 双写改造为"单写+同步":新服务写入后同步到老库(或反之),降低双写复杂度;同步采用批量+削峰
切换期读写路由错乱(同一笔交易分别命中新老系统) 通过灰度路由+业务主键维度(如按客户号哈希)固定路由规则,保证同一客户同一时段只路由到一个系统
回滚困难 保留老系统完整数据与代码版本,设定回滚预案;切换不成功的模块可立即回切到老系统,待修复后再切换

四、评分要点

必答采分点(拿满基础分):

  1. Q1:从"变更范围/变更成本/变更影响"三个度量维度描述可修改性问题(各1分)+ 两个战术名称准确(2分);
  2. Q2:Big Bang四条反对理由至少答出3条(3分)+ 绞杀者阶段划分完整("路由→边缘→核心→同步→下线"缺一不可,5分);
  3. 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重写安全十倍。"

(考试原话级表述,可直接用于案例题结论段或论文总结段。)