金石系统 | 多中心高可用的交易系统

2024-03-09 17:50

本文主要是介绍金石系统 | 多中心高可用的交易系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击「京东金融技术说」可快速关注


「摘要」互联网应用多以SOA、微服务架构,多实例多机房部署方案为主;此架

构基本能够满足大部分应用场景,也是现在大部分公司及组织机构最主要的系统架构及部署方案。但是,身处崇尚创新、追求卓越的团队氛围下,对于京东支付用户体验的的无限渴望;以多中心高可用为核心架构思想的交易系统应运而生,后面我们称之为金石系统

金石系统的主导思想是尽量不强信赖于任何系统,包括数据库、缓存等存储介质;同时对于机房的可用性也做了全面的容灾策略,实现了交易系统的多中心架构。另外,主线流程非常简洁,本着能异步就异步的基本思想,尽量降低系统运行风险,提升系统的自愈能力,作为未来5年的核心底层服务,为整个京东支付保驾护航。

金石系统支持着网银支付机构的全部交易;囊括快捷、网关、白条、小金库、钱包余额、线下充值、预付费卡、支付营销等支付工具;支撑着收单、代收、会员、预授权、退款等交易产品;推动着账务、清结算、交易记录、企业站等业务系统的正常扭转;是支付链路中非常重要的一环;承上启下,记载了支付过程中产生的支付数据,作为支付的主要凭证;支撑着每年的618及双11大促;对商城、金融、全球购、外单等不同商业主体提供高可用的底层支付服务。

---支付核心研发部出品

项目背景


随着业务体量的越来越大,每分钟上万、每天上千万的支付请求,瞬时峰值几十万的支付请求;现有的系统已经没有办法支撑未来几年的日常需求及大促压力;再加上老旧的架构体系,极其不稳定的中间件(MSP),非常昂贵的数据库(Oracle),与集团脱节的RPC技术(DUBBO),强依赖数据库,单中心的系统架构等问题,使得系统的全面架构升级迫在眉睫。

因此,重新搭建一套高可用多中心架构的交易系统迫在眉睫。

  • 2016年11月14日:金石系统项目正式启动。初步搭建一个解决方案突击小组,经过半个月先后10几次的头脑风暴,最终初步拟定出一套完整的多中心技术架构的实现思想。

  • 2016年11月25日:开发小组正式成立。搭建了一个5.5人(4全职+3兼职)开发团队开始突击攻坚。

  • 2017年1月18日:全面上线。经过小伙伴们2个月的并肩作战,金石系统于2017年1月18日全面上线,线上不断测试优化,找各个相关系统进行最后的线上联调测试。

  • 2017年2月15日:正式开始线上切量,继续观察业务的运行情况,不断完善,不断优化。

  • 2017年3月31日:京东集团内部流量于全量切完。

短短的4个月从无到有,再到全量切完集团内单,整个流程进行的非常顺利,没有出现任何重大事故,在此非常感谢小伙伴们的辛苦付出,你们是最棒的。

基本架构思想

1、取消存储介质的强依赖

数据库是数据落地的主要存储介质,也是业务正常流转非常重要的一环;往往出现问题就是非常致命的,甚至短时间内都无法解决。因此,取消数据库的强依赖是高可用系统非常重要的一步,尽量保证数据库出问题时,业务依然可以正常运行。

线上业务对系统高性能的诉求越来越大,缓存被很多扛量系统所采纳,一旦缓存挂掉,全部打到数据库上,往往是灾难性的。因此,核心业务去掉单一缓存的强依赖,增添一套备用缓存是相当有必要的。

取消存储介质强依赖的主要方案如下:

(1)      接入JIMDB/R2M双备份缓存,将查询尽量打到缓存上;

(2)      接入JMQ,当数据库入库失败时,进行数据重试回写;

(3)      接入MQSender,对JMQ服务进行容灾,尽量保证异步消息的高可用性。

 

2、UUID本地化

很多业务场景都需要唯一的业务单号,通用的方式是采用数据库序列进行生成,此方式强依赖数据库,数据库故障将是致命的(本人亲身经历过,非常深刻)。

UUID服务架构升级过好几版;从集中性强依赖数据库方式;到集中式不强依赖数据库方式;最终变身为不强依赖任何服务,完全本地化jar包方式生成;完全经受住京东618、双11大促的考验,在部门内部广泛推广,得到大家一致的好评。

主要实现原理如下:

(1)      实例首次启动时,连接注册中心获取实例号,并保存到实例所在机器本地,以后不再获取;

(2)      单号加入时间戳,时间精度精确到秒,秒级支持并发量位数可以动态配置;达到单机单号不重复,加上实例号达到集群不重复;

(3)      这样UUID的生成将完全在本地JVM内存中生成,保证最优的性能及稳定性。

3、缩短业务主链路

随着SOA架构、微服务被各大企业集团采纳,一个业务往往不再是一个简单的系统,整个链路上存在着越来越多的分支流程;但是肯定不是所有的环节都是必须的,也不是所有的节点都是必须实时处理的,更不是每个分支都是必须成功的,短时间降级是可以接受的。

因此,合理的把控及缩短业务主链路流程往往能事半功倍,甚至是一个高可用架构的必备思想,只有做到主链路尽可能的短,才能最大限度的保证系统的高可用性,关键时刻可以将性能较低、服务异常的非主链路服务降级,尽量保证业务主链路的正常运行。同时,主链路越短,业务耗时越短,系统性能越高,运行越平稳。

多中心架构

随着互联网化的不断深入,各行各业对于系统的高可用性的要求也是越来越高;任何一个系统在开放的互联网大环境下短暂停止服务,负面影响的代价越来越大,因此系统的高可用性也已经成为企业硬实力的一个体现。系统的高可用需要很多方面来保证,不是一个简简单单的系统就能搞定的,也不是堆硬件就可以实现的。多中心架构是实现高可用系统非常重要的一种方案;系统的多中心主要是DB的多中心,下面咱们对金石系统的多中心进行详细的分析与探讨。

1、多中心架构基本思想

(1)   在三个不同的机房,分别部署一套集群,每个集群都只承载1/3的线上流量;

(2)   三个集群都承载线上流量,没有任何一个机房平时是闲置的,也没有任何一个机房拥有全部交易数据;

(3)   每个集群都有一套同机房1主1从数据库集群,异机房还有一个非常重要的灾备从库,最终每个机房都是1主2从的数据库集群;

(4)   平时灾备库都只是有连接,没有数据库读写权限,只有当机房出现故障时,才将灾备库的读写权限打开,同时将备用机房打开,这样就可以将故障机房的流量打到灾备机房去;最终达到不影响线上业务的终极目标。

2、机房故障切换 – A机房故障

(1)   当A机房故障时,需要DBA对于A机房的数据库集群做主从切换,将主库切到灾备机房(B机房)的A3从库上;

(2)   再将A机房配置为线下状态,此时A机房的流量将自动打到灾备机房B机房,此时B机房将承载整个流量2/3的量;

(3)   本属于B机房的流量还会打到B机房对应的主库上;

(4)   本属于A机房的流量会打到B机房中A机房的灾备A3库上;

(5)   当A机房好了后,依赖数据库的主从同步,将A3库中的数据同步到A机房的两个数据库中;

(6)   再找DBA对于A机房的数据库集群做主从切换,将主库切回到A机房的主库上;

(7)   最后将A集群上线,此时A机房的流量将自动打回到A机房;

(8)   这样一次A机房的故障容灾切换就完成了,在切换的过程中,跨集群的共用缓存将起到至关重要的左右,将保证整个切换过程中尽量达到无损。

3、机房故障切换 – A/B机房同时故障

(1)   当A/B机房同时故障时,需要DBA对于B机房的数据库集群做主从切换,将主库切到灾备机房(C机房)的B3从库上;

(2)   再将A/B机房同时配置为下线状态,此时A/B机房的流量将自动打到灾备机房C机房,此时C机房将承载全部业务流量;

(3)   本属于C机房的流量还会打到C机房对应的主库上;

(4)   本属于B机房的流量会打到C机房中B机房的灾备B3库上;

(5)   本属于A机房的流量会打到C机房对应主库的一套Other表上,同时会发出一条同步数据JMQ消息,来保证当A机房好了后自动将数据同步到A集群数据库中;

(6)   后续操作跟单纯的A机房故障一致,不再赘述。

总结

金石系统圆满的完成了它的首次618大促,高效稳定的支撑着整个618大促。同时,通过了线上的机房故障演练,无损的支撑着整个京东支付各个业务;也是京东金融首例多中心架构应用,此项目的战略意义非常重大,希望日后可以将此项目的架构思想在其他系统上继续完善壮大。最后,发自肺腑滴...希望京东支付越来越好,希望京东金融日趋强大,希望我们的大京东光明无限。

---支付核心研发部出品

京东金融技术说

   ▼▼▼     

原创·实用·技术·专业

不只一技之长

我有N技在手

你看,我写,共成长!

这篇关于金石系统 | 多中心高可用的交易系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/791468

相关文章

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序