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

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

相关文章

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

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、正向解析的配置