2. 金融行业(一)

银行核心系统,说白了就是银行的"心脏"。存款、贷款、转账、清算,全跑在上面。过去三十年,国内大行几乎都跑在IBM大型机上——z/OS、DB2、CICS,一套组合拳打遍天下。但这两年,情况变了。

为什么变?三个字:卡脖子。大型机贵、封闭、国产化替代压力大。再加上互联网业务对弹性扩缩的要求,大型机那套"垂直扩展"的思路,确实有点跟不上节奏了。

我2019年参与过某股份制银行的核心下移项目,从立项到第一批业务灰度上线,整整折腾了18个月。今天我把里面的关键思路和坑,跟你捋一遍。

一、迁移策略:不是"推倒重来",是"蚕食替代"

很多人一听到"从大型机迁到分布式",第一反应是:把COBOL代码翻译成Java,然后一把切过去。我劝你千万别这么想。

大型机上的核心系统,运行了二三十年,里面藏着无数"没人敢动的逻辑"。你想想看,一个存款利息计算模块,可能经历了利率市场化、营改增、LPR改革……每一轮改需求都是在上层打补丁。底层逻辑早就跟意大利面条一样了。

我个人习惯的策略是"绞杀者模式"——不重写,不替换,而是用新系统逐步"绞杀"老系统的业务范围。

核心原则: 业务不变、接口不变、数据不变。新老系统通过"适配层"对接,老系统逐步退化为"只读"或"归档"状态。

具体分四步走:

  1. 外围剥离:先把非实时、非核心的业务迁出去,比如历史查询、报表生成、对账文件。
  2. 读写分离:核心账务数据保留在大型机,但查询类请求路由到分布式缓存或副本库。
  3. 核心穿透:选择一类低风险业务(比如定期存款到期转存),让新系统直接处理,老系统做"影子验证"。
  4. 完全下线:当新系统覆盖了老系统90%以上的业务量,且稳定运行超过一个完整账期(通常是一个月),老系统就可以关停了。

嗯,这里要注意:第四步最难。我见过一个项目,新系统跑了半年,老系统还不敢关——因为总有一些"长尾业务"没覆盖到,比如几十年前的零存整取、特殊利率协议。这些业务量极小,但合规上不能丢。

二、数据一致性保障:分布式事务的"灵魂拷问"

大型机时代,数据一致性靠DB2的单库强事务保证。一个UPDATE语句,要么全成功,要么全回滚。但到了分布式架构,数据散落在几十个节点上,怎么保证一致性?

我建议你记住一个原则:能不分布式,就别分布式。

什么意思?就是尽量通过数据分片策略,把需要强一致性的数据放在同一个分片内。比如同一个客户的所有账户,按客户号哈希到同一个数据库实例上。这样,跨节点事务就变成了单库事务。

但有些场景躲不开。比如跨行转账——A行扣钱,B行加钱,这天然就是跨节点的。怎么办?

方案 原理 适用场景 我踩过的坑
TCC(Try-Confirm/Cancel) 预留资源 → 确认/回滚 短事务、高并发 Cancel逻辑写不好,会导致"幽灵资源"一直占着
Saga(长事务) 每个子事务配一个补偿事务 跨多个系统、耗时较长 补偿事务幂等性没做好,重复执行扣了两次钱
可靠消息最终一致 本地消息表 + MQ重试 非实时、可延迟 消息积压导致对账延迟,业务方半夜打电话
避坑指南: 我曾经在一个项目中,为了追求"强一致性",给所有跨库操作都上了TCC。结果呢?Try阶段锁住了大量资源,并发一上来,系统直接雪崩。后来改成"最终一致性+对账补偿",反而更稳。记住:银行核心系统,宁可慢,不能错;宁可最终一致,不能锁死。

三、灰度发布:让"切流量"像"开水龙头"一样可控

大型机迁移最怕什么?一把切过去,全崩了。所以灰度发布不是可选项,是必选项。

我参与的项目里,灰度发布分了五个层级:

  • 第一层:内部员工——先让行内IT人员用自己的账户试,出问题影响最小。
  • 第二层:白名单客户——选一批VIP客户,提前沟通好,让他们"尝鲜"。
  • 第三层:按渠道灰度——比如先切手机银行,再切网银,最后切柜面。
  • 第四层:按地域灰度——先切一个省分行,稳定后再全国铺开。
  • 第五层:全量开放——所有流量切到新系统,老系统只保留"回滚通道"。

每一层灰度之间,至少要观察72小时。为什么是72小时?因为很多账务问题,要等到日终跑批、T+1对账才能暴露出来。

一个小技巧: 灰度期间,新老系统同时运行,但新系统的结果只记录、不生效。这叫"影子模式"。等影子模式跑满一个完整账期,确认数据完全一致,再切到"生产模式"。我习惯在影子模式里跑至少两个账期——因为有些利息计算,跨月、跨季才会触发。

四、整体迁移架构图

下面这张图,是我根据实际项目经验画的。它展示了从大型机到分布式架构的分层迁移模型:

银行核心系统迁移架构图(绞杀者模式) IBM 大型机(老系统) CICS 联机交易 DB2 核心账务 COBOL 业务逻辑 日终批量(逐步剥离中) 历史查询(已迁移) 待下线业务(< 10%) 适配层 / 网关 协议转换(CICS → HTTP/gRPC) 数据同步(DB2 → MySQL) 灰度路由(按客户/渠道) 影子验证(双写比对) 分布式事务协调(TCC/Saga) 监控 & 熔断 分布式架构(新系统) 微服务(Spring Cloud) MySQL 分库分表 Redis 缓存 Kafka 消息队列 分布式定时任务 全量业务(目标状态) 说明:老系统业务逐步"绞杀",适配层负责路由、转换、验证,新系统渐进式接管全量业务

五、几个关键指标

最后,给你一组我实际项目中用到的迁移健康指标。每次灰度发布后,我都会盯着这几个数字:

指标 目标值 告警阈值 说明
交易成功率 ≥ 99.99% < 99.9% 新老系统分别统计,差异超过0.01%立即暂停灰度
数据一致率 100% < 99.999% 影子模式逐笔比对,不一致自动触发补偿
响应时间(P99) ≤ 200ms > 500ms 大型机通常50ms以内,分布式允许稍高但不可超过500ms
日终跑批时长 ≤ 2小时 > 4小时 大型机跑批通常1小时,分布式因数据分散可能变慢
个人经验: 数据一致率这个指标,最容易出问题。我遇到过两次:一次是时间戳精度不一致(大型机是微秒级,MySQL只到毫秒),导致比对总是失败;另一次是字符集问题——DB2的EBCDIC编码转成UTF-8后,某些特殊字符对不上。这些细节,你在设计影子验证方案时就要考虑进去,别等到上线了再补。

好了,银行核心系统迁移这件事,说白了就是"胆大心细、步步为营"。技术方案选型固然重要,但更关键的是灰度节奏和回滚预案。记住:大型机迁移不是技术竞赛,是风险管控。每一步都要想好"如果失败了怎么办"。