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

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

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Spring Cloud之注册中心Nacos的使用详解

《SpringCloud之注册中心Nacos的使用详解》本文介绍SpringCloudAlibaba中的Nacos组件,对比了Nacos与Eureka的区别,展示了如何在项目中引入SpringClo... 目录Naacos服务注册/服务发现引⼊Spring Cloud Alibaba依赖引入Naco编程s依

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi

Nginx配置系统服务&设置环境变量方式

《Nginx配置系统服务&设置环境变量方式》本文介绍了如何将Nginx配置为系统服务并设置环境变量,以便更方便地对Nginx进行操作,通过配置系统服务,可以使用系统命令来启动、停止或重新加载Nginx... 目录1.Nginx操作问题2.配置系统服android务3.设置环境变量总结1.Nginx操作问题