2. 金融行业(一)
银行核心系统,说白了就是银行的"心脏"。存款、贷款、转账、清算,全跑在上面。过去三十年,国内大行几乎都跑在IBM大型机上——z/OS、DB2、CICS,一套组合拳打遍天下。但这两年,情况变了。
为什么变?三个字:卡脖子。大型机贵、封闭、国产化替代压力大。再加上互联网业务对弹性扩缩的要求,大型机那套"垂直扩展"的思路,确实有点跟不上节奏了。
我2019年参与过某股份制银行的核心下移项目,从立项到第一批业务灰度上线,整整折腾了18个月。今天我把里面的关键思路和坑,跟你捋一遍。
一、迁移策略:不是"推倒重来",是"蚕食替代"
很多人一听到"从大型机迁到分布式",第一反应是:把COBOL代码翻译成Java,然后一把切过去。我劝你千万别这么想。
大型机上的核心系统,运行了二三十年,里面藏着无数"没人敢动的逻辑"。你想想看,一个存款利息计算模块,可能经历了利率市场化、营改增、LPR改革……每一轮改需求都是在上层打补丁。底层逻辑早就跟意大利面条一样了。
我个人习惯的策略是"绞杀者模式"——不重写,不替换,而是用新系统逐步"绞杀"老系统的业务范围。
具体分四步走:
- 外围剥离:先把非实时、非核心的业务迁出去,比如历史查询、报表生成、对账文件。
- 读写分离:核心账务数据保留在大型机,但查询类请求路由到分布式缓存或副本库。
- 核心穿透:选择一类低风险业务(比如定期存款到期转存),让新系统直接处理,老系统做"影子验证"。
- 完全下线:当新系统覆盖了老系统90%以上的业务量,且稳定运行超过一个完整账期(通常是一个月),老系统就可以关停了。
嗯,这里要注意:第四步最难。我见过一个项目,新系统跑了半年,老系统还不敢关——因为总有一些"长尾业务"没覆盖到,比如几十年前的零存整取、特殊利率协议。这些业务量极小,但合规上不能丢。
二、数据一致性保障:分布式事务的"灵魂拷问"
大型机时代,数据一致性靠DB2的单库强事务保证。一个UPDATE语句,要么全成功,要么全回滚。但到了分布式架构,数据散落在几十个节点上,怎么保证一致性?
我建议你记住一个原则:能不分布式,就别分布式。
什么意思?就是尽量通过数据分片策略,把需要强一致性的数据放在同一个分片内。比如同一个客户的所有账户,按客户号哈希到同一个数据库实例上。这样,跨节点事务就变成了单库事务。
但有些场景躲不开。比如跨行转账——A行扣钱,B行加钱,这天然就是跨节点的。怎么办?
| 方案 | 原理 | 适用场景 | 我踩过的坑 |
|---|---|---|---|
| TCC(Try-Confirm/Cancel) | 预留资源 → 确认/回滚 | 短事务、高并发 | Cancel逻辑写不好,会导致"幽灵资源"一直占着 |
| Saga(长事务) | 每个子事务配一个补偿事务 | 跨多个系统、耗时较长 | 补偿事务幂等性没做好,重复执行扣了两次钱 |
| 可靠消息最终一致 | 本地消息表 + MQ重试 | 非实时、可延迟 | 消息积压导致对账延迟,业务方半夜打电话 |
三、灰度发布:让"切流量"像"开水龙头"一样可控
大型机迁移最怕什么?一把切过去,全崩了。所以灰度发布不是可选项,是必选项。
我参与的项目里,灰度发布分了五个层级:
- 第一层:内部员工——先让行内IT人员用自己的账户试,出问题影响最小。
- 第二层:白名单客户——选一批VIP客户,提前沟通好,让他们"尝鲜"。
- 第三层:按渠道灰度——比如先切手机银行,再切网银,最后切柜面。
- 第四层:按地域灰度——先切一个省分行,稳定后再全国铺开。
- 第五层:全量开放——所有流量切到新系统,老系统只保留"回滚通道"。
每一层灰度之间,至少要观察72小时。为什么是72小时?因为很多账务问题,要等到日终跑批、T+1对账才能暴露出来。
四、整体迁移架构图
下面这张图,是我根据实际项目经验画的。它展示了从大型机到分布式架构的分层迁移模型:
五、几个关键指标
最后,给你一组我实际项目中用到的迁移健康指标。每次灰度发布后,我都会盯着这几个数字:
| 指标 | 目标值 | 告警阈值 | 说明 |
|---|---|---|---|
| 交易成功率 | ≥ 99.99% | < 99.9% | 新老系统分别统计,差异超过0.01%立即暂停灰度 |
| 数据一致率 | 100% | < 99.999% | 影子模式逐笔比对,不一致自动触发补偿 |
| 响应时间(P99) | ≤ 200ms | > 500ms | 大型机通常50ms以内,分布式允许稍高但不可超过500ms |
| 日终跑批时长 | ≤ 2小时 | > 4小时 | 大型机跑批通常1小时,分布式因数据分散可能变慢 |
好了,银行核心系统迁移这件事,说白了就是"胆大心细、步步为营"。技术方案选型固然重要,但更关键的是灰度节奏和回滚预案。记住:大型机迁移不是技术竞赛,是风险管控。每一步都要想好"如果失败了怎么办"。