“分布式透明化”在杭州银行核心系统上线之思考

导读

随着金融行业数字化转型的需求,银行核心系统的升级改造成为重要议题。杭州银行成功上线以 TiDB 为底层数据库的新一代核心业务系统,该实践采用应用与基础设施解耦、分布式透明化的设计开发理念,推动银行核心系统的整体升级。

本文聚焦银行核心系统演进,结合 TiDB在杭州银行新一代核心的实践,深入解析“分布式透明化”理念,希望能为同行业的转型升级提供参考。

本文作者:韩锋 ,CCIA(中国计算机协会)常务理事,前 Oracle ACE、腾讯 TVP、阿里云 MVP。有着丰富的一线数据库架构、软件研发、产品设计、团队管理经验。曾担任多家公司首席 DBA、数据库架构师等职。在云、电商、互金、互联网、银行等行业均有涉猎,精通多种关系型数据库,对 NoSQL 及大数据相关技术也有涉足,实践经验丰富。曾著有数据库相关著作《SQL 优化最佳实践》、《数据库高效优化》。《韩锋频道》公众号作者。

作为国家支柱性行业,金融业在国民经济中发挥着举足轻重的作用。近些年来金融业的运营模式和服务方式都发生了很大变化,这对于金融科技提出更高要求。与此同时,国内金融机构还面临国产化诉求,用以应对脱钩、断供等潜在风险。作为数据应用高地,金融企业普遍存在业务复杂、可用性要求高等特点,尤其是以银行核心系统为代表。对银行核心系统提供做架构升级、国产化改造是风险极大的一项工程。

近期,国内杭州银行新一代核心系统成功上线,引起业内普遍关注。行方从开始就秉承着应用与基础设施解耦架构思想、分布式透明化的设计开发理念,通过与国产分布式数据库 TiDB 的通力合作,完成此次核心系统的成功上线。这为国内广大同类型银行升级,带来积极参考意义;其背后的实践过程也很值得思考。

银行核心系统演进及观察

银行核心系统,也称为 Core Banking,是银行处理存款、贷款业务为主的核心 IT 系统。作为支撑业务营运的关键系统和银行信息化的重要组成部分,被称作银行 IT 系统的“心脏”。同时,银行核心在整个银行 IT 系统架构中是其他业务子系统的基础,处于承上启下的关键位置。核心系统在金融服务能力、处理性能等方面,对银行日常经营的业务与流程优化、提升客户体验度、推动业务改革或创新等方面起着决定性作用。

从历史演进来看,银行核心系统经历了从手工时代到 PC 时代,到联网联机、数据大集中,再到以客户为中心的发展历程。从上世纪九十年代开始,银行核心系统技术架构从数据集中路线演进而来的 “胖核心” 时期;到本世纪头十年因核心系统庞大且耦合严重,将辅助功能拆分后形成的 “瘦核心” 时期;再到近十年来互联网对银行业务产生影响,银行开始构建分布式核心,形成以稳态集中式架构与敏态分布式架构并存的情况。特别是在 2017 年,中国人民银行提出发展规划,鼓励实施架构转型,包括采用分布式架构,这一趋势推动了分布式核心系统的发展。分布式核心系统的关键目标是突破单机系统的数据存储和处理能力上限,同时减小单点故障对整个系统的影响。这通过多机分片处理数据库来实现,提高了银行系统的健壮性和可用性。

在推动分布式核心发展中,以“微服务、单元化”为代表的架构设计理念成为主流。 前者是一种软件架构风格,其应用程序被拆分为一组小型、松耦合的、自治的服务。每个服务都可以独立地进行开发、部署和扩展,并通过轻量级的通信机制(如 HTTP、消息队列等)进行互相通信。其核心原则是将复杂的单体应用程序拆分成更小、更可管理的部件,每个部件专注于完成一个特定的业务功能。后者则通过把一部分计算资源和一部分数据资源进行逻辑上的绑定,形成一个标准化的处理单元。每个处理单元具备完整的业务能力,但只处理全量数据中的一部分,简单理解一个单元就相当于一个小分行。其核心原则是将业务拆分更为细小的处理单元,并可根据需要进行扩展。

无论采取两种架构之一或兼而有之,都对底层基础设施提出更高的要求,特别是数据的主要载体-数据库。 相对而言,单元化更倾向于通过数据拆分,将数据形成一个自包含的处理单元,对数据库的承载体量、处理能力可以通过单机或集中式数据库完成。但由于单元化架构学习、实施成本很高,比较适合于体量较大或有异地多活规划的银行。对以城商行为代表的广大中小规模银行来说,因其技术底子相对较薄、业务系统多以外购或合作开发为主且财力投入相对有限,上述原因都造成了单元化对于中小行不太适合,那么中小行也更多采用“微服务+分布式数据库”的道路。

随着近十年国产分布式数据库的快速发展,其成熟度、稳定性等已趋于完善,开始在金融核心系统为代表的重要业务系统中尝试使用。当然, 这一新架构产品对架构、开发、运维等都带来很多变化 。特别是架构、研发层面,之前业务系统在设计上多是以集中式数据库能力为基础进行的,对于分布式架构存在诸多差异。如何降低这一差异,尽量复用之前架构设计,甚至做到将应用与底层基础架构解耦成为关键。这里提出一种新的观点-“分布式透明化”,即在分布式架构下仍然可沿用单机或集中式数据库的开发设计习惯,做到完全无感。这里不是简单的与某种数据库的语法、运维兼容的问题,而是从架构之初就可以透明处理。正是这种分布式透明化能力给城商行等中小银行的核心系统国产化及升级改造,提供了一条平滑的创新之路。

TiDB 在杭州银行新一代核心的实践

近期,杭州银行以 TiDB 为底层数据库的新一代核心业务系统成功投产上线 ,也是业内首个实际投产的云原生、分布式、全栈国产化的银行核心系统上线,是金融科技领域突破关键核心技术应用的重大实践,标志着杭州银行核心业务系统实现完全自主可控和架构升级。这一实践中正是遵循了“分布式透明化”这一理念,为广大同业建设核心系统架构转型提供了参考。杭州银行此次核心系统升级,在规划之初就将业务与基础设施解耦放在首要因素,从多角度对底层数据库提出很高要求。

从架构角度来看, 首要问题就是解决所谓透明化问题,即对数据库建模、设计、开发过程仍可沿用之前的实践,尽量减少因引入分布式数据库所造成的差异。一方面业务系统开发中很难避免人员的更迭,另一方面很多业务系统也是采用合作开发模式。透明化对于最大化保留原有开发积累,有着重要意义。其次就是需要数据提供全面的兼容能力,对上可以兼容新型应用架构,包括微服务、云原生及可能会有单元化;向下可兼容具备自主创新能力的基础平台。第三则是希望数据库提供标准而非定制化能力,这也是基于业内实践,很多国产数据库当面临功能不足时会提供定制开发已解决问题,但这是不利于用户长期技术战略的。

从研发角度来看, 针对数据分片后不可避免的分布式事务问题,在框架层尚无成熟完善的分布式事务解决方案下,充分利用底层数据库的分布式事务能力来解决,这样开发简化很多。弱化对数据库特性功能的依赖,将很多功能前置到框架层来解决。例如针对数据库中常用的序列功能,即可在框架层提供分布式全局发号器来解决,不再依赖数据库实现。针对数据库经常需面对的热点问题,虽然分布式架构能在一定程度上缓解这一问题,但在开发方面仍可以有多重手段去前置解决。例如,通过缓存与数据库的结合,降低对数据库热点对象的访问。通过将业务处理异步化,将对数据库压力分散开来。这些措施都可以有效解决热点问题。

针对具备金融特点的跑批类业务,通过将处理工作打散并行可以有效提高吞吐量,消除批量热点,充分利用分布式数据库的丰富算力。例如针对银行核心系统日终及日间批量处理采用带有业务属性的分布式调度器,充分发挥分布式数据库 TiDB 支持多会话及高并发处理特性,在原有作业流程基础上由调度器使用分段 SQL 语句或分片算法将任务平均分配,并将分片任务同时下发到多个执行器节点并行处理提升批量处理性能;同时批量任务执行器节点和 TiDB 数据库节点均可实现弹性水平扩展,保证杭州银行在未来业务快速增长、数据规模急剧扩大的情况下,批量处理性能不降级。

从运维角度来看, 引入分布式数据库会带来不小的挑战,当然同时也有着明显收益。从数据完整性角度来看,以 TiDB 为代表的原生分布式架构产品提供的是基于共识协议的多副本机制,能保障数据的强一致性和完整性。从可行性来看,分布式数据库产品多通过三中心仲裁方式来提供整体高可用性,但这一方式成本较高。TiDB 在实现上提供了更为经济的强双中心方案,即当满足同城低延迟的条件下,可通过两中心提供同样的可用性保障能力。通过同城强双中心与异地备份的结合,最终达到 RPO=0 的可用性标准。这也是很多金融行业用户最终选择分布式数据库架构的原因,其不仅可提供高并发、高扩展性,其整体较高的可用性及容灾能力也是被选择关键理由之一。同时这一架构还提供跨中心的多写多读能力,这对于业务侧实现业务同城多活具备重大意义。

针对在具体运维工作中普遍比较头疼的大表 DDL 变更、分布式监控问题,TiDB 也通过特有的对象在线变更技术及可观测技术解决了整体的维护性。金融行业作为涉及国计民生的重要行业,对于供应链安全尤为重视,因此希望数据库产品能提供底层适配能力。TiDB 在这方面提供了多种架构 CPU 的适配能力,可满足用户未来可能的迁移需求,从根本解决“断供”问题。

杭州银行核心系统升级,正是从架构、研发、运维多角度出发,在充分考虑新型分布式数据库能力的同时,结合自身技术发展现状及长远规划,最终选择 TiDB 作为核心系统的数据库,并通过近两年与厂商的通力协作成功上线。杭州银行新一代核心系统上线以来运行安全稳定,大幅提升了业务处理效率, 已支撑日均交易量 1000+ 万笔,平均交易耗时小于 100 毫秒,较原核心业务系统缩减 54%,日终跑批的处理速度为原核心业务系统的 2.1 倍 ,能够有效支撑未来业务的快速发展。

杭州银行实践带来的思考

杭州银行核心系统的成功上线,为广大同业者及数据库行业带来很多思考。中国有数千家金融机构,随着业务发展及技术演进,都正面临架构升级改造的工作。但由于各金融机构,体量差异巨大、发展阶段不同、技术路线各异,很难找到通用性、标准化的路径。与此同时,数据库的发展近年来也呈现“井喷式”发展,一方面采用新架构、新理念的分布式数据库不断涌现;另一方面传统单机、集中式数据库也纷纷推陈出新。上述问题,共同造成金融用户在架构升级改造中很多痛点。

近日杭州银行核心系统上线,走出了一条的适合自己的实践道路, 其秉承的 应用与基础设施解耦 的架构思想, 分布式透明化 的设计开发理念对同行业具有很 大参考意义。在既保持了原有使用习惯的基础上,又在整体架构路线方面选择了可持续创新的架构。未来,希望广大金融 IT 从业者,在面临国产化升级的整体规划上,既需要考虑企业当前现状,也能充分瞄准未来架构的延伸性,以创新的思维推动银行核心系统的整体升级,共同助力中国金融的数字化转型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/258379.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

easyx搭建项目-永七大作战(割草游戏)

永七大作战 游戏介绍: 永七大作战 游戏代码链接:永七大作战 提取码:ABCD 不想水文了,直接献出源码,表示我的诚意

Shellcode免杀对抗(Python)

Shellcode Python免杀,绕过360安全卫士、火绒安全、Defender Python基于cs/msf的上线 cs 执行代码2种可供选择 执行代码 1: rwxpage ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x1000, 0x40) ctypes.windll.kernel32.RtlMoveMemory…

静态时序分析:SDC约束命令set_clock_transition详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析:SDC约束命令create_clock详解一文的最后,我们谈到了针对理想(ideal)时钟,可以使用set_clock_transition命令直…

【VSCode】使用笔记

目录 快捷键系列 相关插件 相关文档链接 快捷键系列 调出终端 ctrl 或者是ctrlJ 结束进程 ctrlc 注释 ctrlkc 取消注释 ctrlku 上下移动代码 alt方向键 多行光标ctrlalt方向键 快速跳过某个单词 ctrl方向键 相关插件 1.每次修改后,自动保存启动项目 相…

2.12:C语言测试题

1.段错误:申请堆区内存未返回,str指向NULL 2.段错误:局部变量,本函数结束,p也释放 3.越界访问,可能正常输出hello,可能报错 4.可能段错误,释放后,str未指向NULL&#x…

【旧文更新】【优秀毕设】人脸识别打卡/签到/考勤管理系统(OpenCV+最简基本库开发、可移植树莓派 扩展网络图像推流控制 验证码及Excel邮件发送等功能)

【旧文更新】【优秀毕设】人脸识别打卡/签到/考勤管理系统(OpenCV最简基本库开发、可移植树莓派 扩展网络图像推流控制 验证码及Excel邮件发送等功能) 文章目录 关于旧文新发毕设结构主页面验证码识别效果管理页面人脸信息采集管理实时数据更新签到结果…

CSS 不同颜色的小圆角方块组成的旋转加载动画

<template><!-- 创建一个装载自定义旋转加载动画的容器 --><view class="spinner"><!-- 定义外部包裹容器,用于实现整体旋转动画 --><view class="outer"><!-- 定义四个内部小方块以形成十字形结构 --><view clas…

sqlserver对已有的表插入列

现有如下的一个表&#xff1b; 现在要插入一个 人员id 列&#xff1b;如下图在设计视图的行首单击&#xff0c;选择 插入列&#xff1b; 然后添加一个 人员id 列&#xff1b; 保存&#xff0c;出现下图提示&#xff0c;不能保存设计&#xff1b; 这就直接使用sql语句更改&#…

leetcode hot100爬楼梯

在本题目中&#xff0c;要求爬第n阶有多少种爬法&#xff0c;并且每次只能爬1个或者2个&#xff0c;这明显是动态规划的问题&#xff0c;我们需要用动态规划的解决方式去处理问题。动态规划就是按照正常的顺序由前向后依次推导。而递归则是从结果往前去寻找&#xff08;个人理解…

单片机学习笔记---LED呼吸灯直流电机调速

目录 LED呼吸灯 直流电机调速 模型结构 波形 定时器初始化函数 中断函数 主程序 上一节讲了电机的工作原理&#xff0c;这一节开始代码演示&#xff01; 我们上一篇说Ton的时间长Toff时间短电机会快&#xff0c;Ton的时间短Toff时间长电机会慢 并且我们还要保证无论Ton和…

小游戏和GUI编程(6) | 基于 SFML 的井字棋

小游戏和GUI编程(6) | 基于 SFML 的井字棋 0. 简介 使用 SFML 实现井字棋(tic-tac-toe), 规划如下: 了解规则&#xff0c; 使用命令行实现(已经实现了)使用 SFML&#xff0c;提供极简的交互(预计 1 小时)制作 SVG 图像&#xff0c; 美化界面(预计 1 小时) 1. 基于命令行的实…

分省年度数据集(1990-2021年)

一、数据介绍 数据名称&#xff1a;分省年度数据集&#xff08;1990-2021年&#xff09; 数据来源&#xff1a;国家统计局-分省年度数据 数据范围&#xff1a;1990-2021年&#xff0c;包括31个省份 指标数量 &#xff1a;2981个指标 数据整理&#xff1a;自主整理 更新时…

线性代数的本质 2 线性组合、张成的空间、基

基于3Blue1Brown视频的笔记 一种新的看待方式 对于一个向量&#xff0c;比如说&#xff0c;如何看待其中的3和-2&#xff1f; 一开始&#xff0c;我们往往将其看作长度&#xff08;从向量的首走到尾部&#xff0c;分别在x和y上走的长度&#xff09;。 在有了数乘后&#xff0…

建造者模式-Builder Pattern

原文地址:https://jaune162.blog/design-pattern/builder-pattern/ 引言 现在一般大型的业务系统中的消息通知的形式都会有多种,比如短信、站内信、钉钉通知、邮箱等形式。虽然信息内容相同,但是展现形式缺不同。如短信使用的是纯文本的形式,钉钉使用的一般是Markdown的形…

【实战】一、Jest 前端自动化测试框架基础入门(二) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(二)

文章目录 一、Jest 前端自动化测试框架基础入门5.Jest 中的匹配器toBe 匹配器toEqual匹配器toBeNull匹配器toBeUndefined匹配器和toBeDefined匹配器toBeTruthy匹配器toBeFalsy匹配器数字相关的匹配器字符串相关的匹配器数组相关的匹配器异常情况的匹配器 6.Jest 命令行工具的使…

C++中类的6个默认成员函数 【拷贝构造函数】

文章目录 拷贝构造函数的使用拷贝构造对于自定义类型【浅拷贝】深拷贝拷贝构造函数典型调用场景 拷贝构造函数的使用 在前几章学习对象的时候&#xff0c;我们有的时候需要一个与已存在对象一某一样的新对象 那在创建对象时&#xff0c;可否创建一个与已存在对象一某一样的新对…

Qlik Sense : 条形图

条形图 “条形图适合比较多个值。维度轴显示所比较的类别条目&#xff0c;度量轴显示每个类别条目的值。” Qlik Sense中的条形图是一种数据可视化工具&#xff0c;用于展示不同类别或维度之间的比较。它通过水平或垂直的条形表示数据&#xff0c;并根据数值的大小进行排序。…

win10 环境下Python 3.8按装fastapi paddlepaddle 进行图片文字识别1

###按装 用conda 创建python 3.8的环境&#xff0c;可参看本人python下的其它文章。 在pycharm开发环境下按装相关的模块&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple fastapi pip install -i https://pypi.tuna.tsinghua.edu.cn/simple "uvi…

《Go 简易速速上手小册》第1章:Go 语言基础(2024 最新版)

文章目录 1.1 Go 语言的安装与环境配置1.1.1 基础知识讲解案例 Demo&#xff1a;简单的 Go 程序 1.1.2 重点案例&#xff1a;搭建一个 Go Web 服务准备工作步骤 1&#xff1a;创建项目目录步骤 2&#xff1a;编写 Web 服务代码步骤 3&#xff1a;运行你的 Web 服务步骤 4&#…

寒假 6

1.现有无序序列数组为{23,24,12,5,33,5,34,7}&#xff0c;请使用以下排序实现编程。 函数1:请使用冒泡排序实现升序排序 函数2︰请使用简单选择排序实现升序排序 函数3:请使用直接插入排序实现升序排序 函数4∶请使用插入排序实现升序排序 #include <stdio.h> #inclu…