2015年作为民营银行元年,网商银行于2015年6月、微众银行于2015年9月正式开业。拥有互联网基因的民营银行,与原先以大型主机为主的全国大集中时的系统建设模式不同,采用了去IOE的分布式微服务架构来建设核心系统,给行业提供了一种新的设计思路,同时对传统银行也产生了较大的触动。
其次是近年来,在监管要求和鼓励国产化的大力推进下,如2017年中国人民银行发布了《中国金融业信息技术“十三五”发展规划》,明确提出“以安全、可靠、高效、弹性为重点目标实施架构转型,探索分布式架构和成熟开源技术应用,逐步减少或摆脱对单一技术产品的依赖”,因为国产化在大型主机为主的方向上有所缺乏,所以在寻求新的建设方向上多了一个选择,分布式核心系统出镜率越来越高。
图1-7 网商银行;微众银行
分布式核心系统与集中式核心系统是相对的,有好几种组建模式,接下来逐一阐述,还包括分布式微服务的核心与以往传统核心系统的区别。特别值得注意的是,分布式和微服务两个词经常是同时出现,但却是两个不同的概念,不能混为一谈。
分布式是指核心系统对存储数据使用多机进行分片(即数据库的处理),原先的单机系统或上一代的核心系统,对于数据来说是存储在一个数据库上,单机系统的存储空间受限于硬盘或上限,若要支持海量存储则价格非常昂贵且存储性能也有一定上限。
其次,CUP和IO也受限于单机系统本身的资源限制,若是用多机分片就可以将单机器的工作分散在多台机器上,那就可以根据数据量的规模做横向的扩展,使用计算能力稍微差一点的机器通过拼数量的方式做到海量数据的及时处理;还需避免单点故障,或者说机器突然之间变成不可用,那会影响整个系统的所有用户、客户及账户等。
因此,分布式目的有两个:
一是突破单机系统的数据存储和数据处理能力上限,使得数据量规模可以横向扩展。
二是分片后减小单台机器设备突发故障的影响面,使得一个故障只影响一个分片的机器,而其他分片可以照常处理。这样就不算系统整体中断服务。
分布式银行核心的功能主要是针对于数据存储,提高了银行系统运转的健壮性或可用性。而微服务是另一个着眼点,抽象的说是指核心系统应用程序的一个部署与拆分的模式。
具体的说是指核心系统按照功能模块进行服务拆分,原先可能是将各个模块的所有程序全部打包在一起,作为一个整体去运转,再按照微服务拆分之后,只需要按模块进行相应的服务拆分,拆成一块块小的包,然后对每一块做单独的打包并部署在不同机器上,目的是解决模块间的耦合问题,用来降低系统修改时的影响范围和难度。
从银行核心系统的数据库方面看,分布式的发展经历了以下几个模式:
(1)应用数据库一体化模式
应用数据库一体化是核心系统最早期的模式,如PC单机和最早期大集中阶段,核心系统的应用程序作为一个整体部署和运行,与数据存储(即主机的文件系统或开放平台的数据库)合在一台高性能机器上。
因为应用和数据库在同一台机上运行,所以应用模块之间的调用,属于程序内的函数调用,应用进行数据库操作属于本机访问。
在该模式下,本地调用消耗最少、单笔交易的处理耗时也非常短、交易响应速度很快,当然,对高性能机器的压力也相当大,既要处理数据库文件也要处理应用程序的逻辑计算,若是在机器性能不太够的情况下或交易量提升后,容易形成资源争抢。
IBM大型主机即此类模式,优点是应用与数据文件一体化,应用直接操作底层的数据文件,数据隔离层数越少那么访问效率越高,因此单机处理可以达到很高的性能。
图1-8 应用数据库一体化模式
(2)应用集群、数据库集中模式
基于模式一资源受限的背景下,诞生出了应用集群、数据库集中的新模式。简单的说,就是应用与数据库分离成不同机器部署,数据库仍用一台高性能的机器,应用程序作为一个整体在其他机器部署运行。
由于应用程序不带有任何状态,因此可以一模一样的复制多台机器,尽管应用程序有可能会并发量很大,但可以堆小的机器来实现负载均衡。因为对于一笔交易来说,不管路由到哪台机器上执行应用程序,最后都会落到数据库上,最终交易的执行效果都一样。
此模式下,由于将数据库与应用分离,降低了数据库机器资源的争抢,从而提升了单机处理数据库的能力;而应用集群部署,提升了应用的横向扩展接入能力,解决了应用的单点故障,因为一台应用程序的机器出现故障,会路由到其他应用程序上继续执行交易,所以对整体系统来说没什么影响。
但由于应用程序跟数据库拆分之后,会使得应用每一次访问数据库都会变成一次跨机器的网络访问,那么单个交易访问数据库次数越多,耗时延长状况就会越严重。
对一笔普通的账务交易而言,确实存在操作几十上百次数据库,所以汇总起来的消耗相当大,在业内通用的处理方式是:尽可能在银行内建设万兆网络,用高速的网络减少网络的消耗,其次是尽可能的想办法减少应用程序访问数据的次数,比如在应用程序端引入缓存,那对于相同的数据就无需多次访问数据库获取数据了。
图1-9 应用集群、数据库集中模式
接下来我们继续看下一个模式:应用集群、分布式数据库的模式,这时出现了分布式数据库。
(3)应用集群、分布式数据库模式
前两种模式的数据库都是单机的,那么资源会存在上限,为了解决数据库资源上限的问题,就需要将数据库拆成多个机器来处理,那就出现了分布式数据库。
接下来继续看第三模式:应用集群、分布式数据库,即数据库与应用分离成不同机器部署。就是说采用分布式数据库,应用程序搭建集群在其他机器部署运行。
图1-10 应用集群、分布式数据库模式
如上图,分布式数据库可以对数据库划分若干分片、内部是由多台机器组成的,但对应用程序而言(即对外展示)是一个整体,表现和单个数据库一样。因此分布式数据库作为一个数据库软件来说,自身保证了内部的事务的一致性和可见性,且作为一个整体,也做到了数据库内部的整体备份和恢复。
在此模式下,使用分布式数据库解决了模式2的数据库横向扩展和单点故障问题,对应用程序来说,与模式2相同,改动也是相对来说比较小的一种模式。
截至目前,国内银行核心系统当中采用分布式数据库,已经有些实际的案例了。早期在项目实施过程中比较担心的就是分布式数据库概念太新,能否运用在实际工作中,或是到底好用不好用等。
银行核心系统使用国产数据库案例,如下:
图1-11 银行核心系统使用国产数据库案例
作为分布式数据库的方案来说,也有一个成熟的过程,在使用的越来越多、解决问题也会越来越多的情况下,会逐渐逐渐的变得更加成熟起来。因此该模式从理论上来看,确实是一个可选方案,也是一个相对来说比较好的方案。
(4)单元化模式
在上一模式中介绍的分布式数据库模式,是由分布式数据库内部做切片,而单元化模式的数据库与应用分离成不同机器部署,是从系统规划上入手,采用普通数据库按照hash或者range切片的方式将数据库切分成表结构完全相同的若干份,每一份都是一个普通的数据库,那应用程序要和数据库分片做相应的绑定。
也就是说,每一份都有应用集群与之对应,可以理解为都是一个完整的核心系统,只是数据库分散的是一部分数据。
图1-12 单元化模式
如果一笔交易当中要处理多个分片的数据怎么办?
那这时就要采用跨机器的网络外调方式,在应用程序之间进行相应的交易或程序的调度,同时对应用系统提出了更高的要求,需要应用层要实现分布式事务的管理,达到一致性的要求。
原先是一个数据库连接里面所有的操作都是由数据库保证它的一致性,但在单元化的模式下数据库无法实现一致性的要求,因为有很多个跨应用程序的调用,所以只能应用层实现。
另外,在该模式下无法做到像原先单机数据库一样指定时间点对所有的数据(含已完成或已提交的交易)做完整的备份或恢复,因为单元化模式下每个切片都是一个相互独立的数据库,所以做不到整个核心系统数据同一时点的一致性备份和恢复。
下面就进入微服务部分,微服务的概念是互联网公司提出并发展起来的。互联网和银行早期一样,初期规模较小时,业务单一就一个系统,随着逐渐发展,业务越来越多,因此系统就发展成类似银行综合业务系统一样大而全的系统,也同样遇到了银行数据大集中时期相同的问题。但互联网有一个特点,就是IT系统都是自主开发,没有外购。
于是,综合业务系统的拆分,就形成了微服务的框架模式,即使用相同的技术栈,去建设一个个独立的子系统,运行于同一套框架体系内。这样更有利于公司内部人员的复用、以及基础平台的复用。
而银行瘦核心,其实做也是做的同样的事情,只不过银行选的路线是从各个厂商外购成熟产品再进行客户化开发,因此也就很难以一套应用框架去要求各家厂商,因此银行形成的是SOA系统互联的体系。
接下来就从核心系统的应用部署的角度看,微服务的结构经历了以下几个模式:
(5)应用整体打包模式
首先介绍最早期的核心系统应用整体打包模式,如下图可以看到核心系统的应用程序,虽然分了很多模块,但是最终编译打包成一个可执行程序运行。
启动应用程序时,所有程序就都启动了,当一笔交易当中发生跨模块调用时,都是在可执行程序内发生函数调用去执行的,因此模块之间没有任何边界,可以直接调用。
图1-13 应用整体打包模式
在此模式下,模块边界比较模糊,程序跨模块使用也没有阻碍,特别是维护阶段时间长了,非常容易逐渐形成系统耦合。
(6)应用模块打包整体运行模式
为减少应用模块之间的耦合,从而做到模块间边界清晰,因此产生了新的模式,要求各模块分开编译打包,不允许跨模块直接调用,若要跨模块访问必须使用外部函数接口声明的方式明确程序功能的所属模块,也更容易梳理各模块的内部功能与对外需提供的服务,及程序之间的调用关系和定位;
其次是通过模块分别打包编译的强约束,来解决这个耦合性的问题。
图1-14 应用模块打包整体运行模式
在该模式下,模块边界清晰,代码不可能混入其他模块,模块间调用需要使用外部函数接口声明。通常编译时是打成一个个不同的包或一个个不同的库,但最终在一个主框架内加载所有模块运行,模块间调用仍属于进程内部调用,因此调用效率很高,可以让数据库连接、分布式事务等全局部分在各模块共享使用。
(7)应用微服务模式
最后一种是业内最近常见的应用微服务模式,可以理解为是将银行核心系统的应用程序按照模块分别编译、打包,打包成这种可执行程序然后每个模块分别部署运行。
需要注意的是,数据库与应用程序一一对应,各模块分别部署时所访问的数据库也会相应的拆分出来。
图1-15 应用微服务模式
如上图,黄框代表一个一个单元或微服务的机器,每个框都是一个整体,比如应用模块1对应着模块1数据库、应用模块2对应着模块2数据库。若一笔交易通常会涉及到多个微服务调用时,那就需要在微服务框架内进行跨模块的远程调用,并由应用实现分布式事务来保证一致性,与单元化类似。同样,也做不到整个核心系统数据同一时点的一致性备份和恢复。
值得注意的是,微服务的分布式事务一致性,目前在业内通常使用的有SAGA回冲模式和TCC回冲模式。
SAGA回冲模式是指挨个模块逐一调用,若调用有问题或失败则调用冲正,比如先调第一个、再调第二个、再调第三个...如果第3个出现问题或调用失败时,则反向回冲,即调用第二个冲正、再调第一个冲正等。TCC回冲模式是指不是将整个交易做完,而是先做预处理,先做模块1的预处理、再做模块2的预处理、再做模块3的预处理...如果全部都成功后,再依次做模块三的确认、模块二的确认、模块一的确认,如果当中出现问题或失败,则做模块三的取消、模块二的取消、模块一的取消等。
SAGA和TCC两种回冲模式均为最终一致性,即整个业务处理完成后才能保证整个是一致的。对数据库事务而言,每一步的事务都会先做提交,等到后面出现异常再做回冲或取消,那多个并发时,可能出现读取到其他并发才处理了一半,最终不一定成功的数据。
比如说执行流程有步骤1、步骤2和步骤3,当系统执行到步骤2,此时步骤1已提交。但是其他并发读数据时会发现,读到的是步骤1处理过的数据,但实际上,前面的步骤1最终的结果不一定是成功的,因为还有后续步骤未执行完,如果后续步骤失败之后则被回冲掉。所以并发读到的是一个不准确的数据。该场景在早前的单机数据库中叫读未提交,就是还未提交最终提交的数据会被读到,在银行核心系统中是不允许出现的,因为会造成业务逻辑判断的失误。
因此使用此种模式要小心,需编排交易流程步骤,在交易层调度各微服务,并精心组织调用顺序,以保障银行业务安全的顺序执行。
比如先做对银行安全的步骤再做对银行不安全的步骤,要尽可能让别人读到的是对银行安全的数据,就好比原先支付系统跟核心系统的交互,通过先核心记账再付款的方式。
另外,要特别避免带事务的深层次嵌套微服务调用。
介绍完我国银行核心系统的发展历程,银行可以结合现有系统的使用情况以及产品和服务革新需求、转型急迫性等方面,全面掌握自身所处的状况并结合当前基础设施、市场动态、客户需求和组织能力等方面,决定银行核心系统的实施路径。
例如,观望(不作为)、升级(涉及较小的应用程序功能或技术变更)、重构(主机下移或转Java等提升系统的现代化)、增强(部署一个并行的核心系统运行一系列的差异化服务)、更换(以现代化的解决方案替换现有核心系统,即建设新一代核心系统)。
图1-16 我国银行新核心建设情况(2017-2021年)
针对更换核心系统的原因,站在银行的角度进行分析,主要从以下维度进行思考:
功能:系统技术非市场主流,与主流技术对接产生障碍;因为银行的合并,现存的任何一个核心系统无法对应不同文化的银行多样应用系统整合的需求;
风险:每一代的银行面对的社会经济活动不同,对系统的架构与应用要求产生结构性的影响,必须以重建的思维从根本解决;业务规模(业务量、经营范围)扩大,旧系统无法应对;
运维:旧系统厂商退出市场(硬件、软件);因为希望合并迅速整合完成,急急忙忙的系统整合,导致旧系统降低服务水平,缩短原系统寿命;核心系统生命周期,因为科技与社会经济活动改变而逐渐缩短;
成本:旧系统的应用系统时间久了打满补丁,新的需求开发费时费力;旧核心系统成本贡献比逐渐升高,特别是主机型系统用户;
收益:核心系统经营管理模式随着科技与应用的改变,产生多样的核心系统经营方式可供银行依据自身条件(规模、人力、成本、效益)选择(自建、购买、托管);
组织:旧系统开发、维护人才逐渐凋零,借着新系统的开发培养下一代的接班技术人才;
银行的金融交易涉及到客户资金运转,在国民经济发展中处于特殊重要地位。所以银行的业务特性决定了银行对交易和数据的及时性与一致性要求非常高,必须准确、不可丢失,安全性、可用性、可追溯,更是互联网金融企业无法比拟的。
例如,对于外汇业务,利率的实施变化决定了相关业务要实时相应,如果时效性、准确性达不到要求,就会给客户或银行带来损失。再如,在证券行情实时变化时,银证转账如果不能满足要求,可能会给客户带来巨额损失;一些大额的转账或汇兑如无法满足时效性及一致性,可能给客户的资金使用带来风险。当然,互联网企业的优势(如海量服务能力、注重客户体验、大数据服务能力等)也是传统商业银行转型必须具备的。
及时性:是指要及时响应客户的交易行为,避免可能带来的损失。因为银行系统的处理能力与银行规模和科技投入有关,所以主要从银行核心系统的几个关键指标来了解自身发展情况和目标,如响应时长、每秒事务处理数、每秒请求数等。
响应时长(RT):从发出请求到得到响应的耗时,即从前端界面按交易提交键、到处理结果并反显全部信息到前端界面之间的时间间隔。一般可以采用毫秒单位来表示,而对一些RT比较敏感的业务场景下,可以使用精度更高的微秒来表示。
每秒事务处理数(TPS):每秒能够处理的事务数,其中T(Transactions)可以定义不同的含义,它可以是完整的一笔业务,也可以是单个的接口请求。
每秒请求数(RPS):也可以叫做QPS,但它与TPS有所不同,前者注重请求能力,后者注重处理能力。不过,若所有请求都在得到响应后再次发起,那么RPS基本等于TPS。
数据库性能:指的是有关数据库的指标,比如资源超时、资源死锁、数据库连接、内存泄漏等。
一致性:在分布式银行核心系统中,一致性是指数据在多个副本之间能否保持一致的特性。在一致性的需求下,当一个系统在数据一致性的状态下执行更新操作后,应保证系统的数据仍然处于一致。提到一致性就离不开分布式事务、缓存等,就不逐一展开了。
安全性:是指通过信息安全建设和管理,有效控制和防范信息安全风险,确保企业与客户的信息及资金安全。主要包括机房、网络、数据、系统、制度等安全方面进行保障。
高可用:是指系统提供的服务必须一直处于可用的状态,所有处理环节避免单点故障,当故障发生时可以快速恢复,如果在故障发生时具备故障隔离或备灾备容错能力,如多活并行处理、两地三中心等,RPO(Recovery Point Objective,恢复点目标)、RTO(Recovery Time Objective,恢复时间目标)等指标无限趋近于零。
如下表:
图1-17 不同灾难恢复能力等级下的RPO和RTO
图1-18 可用性及衡量标准
可用水平(%),通常都包含了信息系统计划停机的时间,即为了系统维护、新版本投产等原因,人为主动的让系统停止对外提供服务。因此,要提高可用水平,需要减少系统的计划停机时间。