探秘苏宁金融升级版秒杀系统

红包系统的技术挑战

红包,升级版的秒杀系统,红包系统应当具备秒杀系统所具备的特性。

大量用户抢红包带来了系统的高并发压力;大量用户抢同一红包带来了数据一致性问题:红包不能超发,漏发,重复发;而由于红包涉及到资金,也会带来资金安全问题。

由上述可见,一套红包系统,主要的技术挑战在于:系统的高并发,一致性,高响应,安全性等。

红包系统性能优化(高性能&数据一致性)

流量的削峰填谷

削峰填谷:顾名思义,就是在流量洪峰到来之前在系统负载比较低的时候进行数据预热等操作,用来分散红包活动开始后的高并发流量。

红包类营销活动的业务特点:定时的洪峰流量,通过“削峰填谷”有效减少瞬间流量对系统造成的冲击。

开户:用户参与苏宁抢红包活动,均需提前开通红包账户,在红包活动开始后,用户瞬时并发大。

短时间内大量用户参与活动,开通红包账号会将访问请求瞬间提交到后端应用,会给后端的业务系统造成很大的开户压力。

为减轻基础服务压力,将流量峰值进行削峰,我们采取了如下措施:

  • 提前蓄水开户,在活动爆发前,采集近期内的活跃会员进行批量提前开户,降低活动开始时的开户压力。
  • 进入红包活动聚合页提前开户,在用户进入红包活动聚合页时提前开户,降低发红包以及抢红包中的开户压力。

预热活跃用户

流量削峰填谷

异步化

异步红包充值及订单持久化:在红包发放环节,大量用户红包需要到账,如果不对峰值进行处理,压力将会直接转嫁给上游系统造成处理压力,间接导致红包系统堵塞。

因此将充值转为异步处理,先将充值任务进行队列存储,然后分摊到多台机器(利用分布式优点)处理,提升系统处理效率,避免单台节点压力过大。

多级缓存(热点数据全局缓存化)

EHCACHE:本地对读取多,修改少的数据做 EHCACHE 本地缓存处理,减少访问数据库、分布式缓存的次数。

数据库缓存:提高数据库热表的数据缓存大小。

Redis:全局 Redis 数据化处理,利用 Redis 单线程,基于内存读写高 QPS 的特性,解决热点数据高并发,线程安全等一系列问题。

热点数据(包括红包订单,用户发,抢记录等)均存储至 Redis 系统中,并进行多分片部署,通过 Redis 高并发读写的特性,提升系统吞吐量。

另外,目前高并发 Java 系统的核心都是分布式微服务集群部署,这种部署情况下 JVM 级别的锁,线程安全的数据类型等都不适用,那么如何保证红包敏感数据在高并发下的线程安全性呢?

答案还是 Redis,利用 Redis 单线程的处理特性,Redis 在修改数据方面是线程安全的。

以下为红包系统中用到 Redis 存储的部分场景:

Redis Pipeline 管道模式

烟花红包燃放环节对于系统响应时间要求很高。开发初期按照 2000 人参与,5S 响应时间设计,系统已经达到性能需求的要求。

但在活动运营后,易购将活动参与人数提高到了 8888 人,按照原有方案,响应时间变为 13S,耗时大大加长,无法满足性能要求。

在对 Redis 进行大批量的操作时,可以使用 Pipeline 模式,通过减少网络传输时间,从而极大的提高系统性能。

在烟花红包发放中需要对 Redis 进行大量查询操作,在实际测试中发现在对接近 1W 个命令进行循环普通同步模式时需要 10S 左右,而改用 Pipeline 模式后处理时间在 100 毫秒以内。

分布式锁组件

回调式的分布式锁组件

在拆红包环节时可能出现同一用户拆两次红包的问题:当用户点击过快时,可能同一用户的两个线程同时通过了是否拆红包的条件校验,在这种情况下,该用户可以拆两次同一个红包。

针对这一问题,我们通过对红包单号,用户编号两个维度加分布式锁来解决。

目前常用的分布式锁大致有三种实现:

  • 数据库
  • Zookeeper
  • Redis

基于实际执行效率和实现难度的考虑,在红包系统使用 Redis 实现了分布式锁组件。

加锁:使用高版本 Redis  set 命令的 EX,PX 属性,实现加锁,超时时间设置的原子操作。

加锁

释放锁:通过 Lua 脚本来实现锁值判断,释放锁的原子操作。

释放锁

执行入口

抢红包、拆红包前的高效前置校验

拆红包作为红包操作中并发最高,处理步骤比较复杂的部分,如何削减拆红包的流量至关重要。

抢红包是拆红包大并发流量的第一道入口,系统设计要尽可能满足快进快出的要求。

抢红包流程图

抢红包时只通过缓存计数器做简单的红包状态检验,可以过滤掉大部分拆红包的流量;计数器设置为仅从主 Redis 读,避免随机读的延迟问题。

红包系统高可用架构实践

分布式任务调度

分布式任务调度包括红包超时退款、异常补偿等,红包超过设定时间未被领取完如何退款?红包发放因为系统、网络等各方面的原因,导致用户红包到账失败如何给用户进行补偿?

因为红包涉及到资金问题,所以在红包发放、到账、退款方面需要万无一失,否则可能会遭到用户的大量投诉,在这里我们用苏宁统一任务调度平台进行分布式部署系统的定时任务调度。

定时扫描数据库中符合条件的订单,进行超时退款,发放异常重复订单发放等操作。

支付链路&账户分离

通过设计专用的红包极简收银台、红包账户实现红包发、抢、拆等过程与普通账户、支付链路分离,避免在大促时对支付、会员、账务核心等购物核心主链路造成压力。

高可用部署架构

上图为苏宁金融会员红包系统目前的单集群部署示意图,是典型的苏宁技术体系下的分布式,高可用系统部署结构。

它具备水平扩容,容灾和监控的能力:

  • 前端流量会通过 HLB 来分发和负载均衡至 WAF 平台。
  • WAF 经过防火墙处理后分发至 HTTP 服务集群(目前主要为 Nginx)。
  • 然后由 HTTP 服务器进行流量反向代理,分发至后端应用服务器进行处理。
  • 服务与服务之间,通过 RPC 远程调用框架进行服务的发现,注册与调用,消息队列使用 Kafka 进行通信。
  • 在存储层使用 Mycat 来访问分布式数据库进行读写操作,分布式缓存使用多分片 Redis 进行存储。

服务器使用 Zabbix 平台进行性能监控,统一任务调度平台进行分布式任务的分发,使用云迹平台进行分布式日志的采集与查看。

为同时应对多个渠道,多种类型的红包类大促营销活动,红包系统采用多个集群部署方式部署,在本次双十一大促中同时为集团各产业红包—奖励金红包、体育红包、圈子红包等营销产品提供高性能高可用的服务支撑。

红包系统的大促保障

红包系统作为公司每次大促营销活动的重要参与系统之一,在 818&双十一等大促中需要应对瞬间海量流量,那么我们如何在大促中监控、保障系统呢?

系统监控

目前在大促活动监控方面,主要分为两大块:

  • 业务监控
  • 中间件监控

业务监控:苏宁金融自研监控平台,可以细化到服务秒级的调用数、成功率、调用耗时等的监控,可以灵活针对各项维度进行告警设置,在业务异常时进行短信或者邮件告警。

业务监控的意义在于实时监控生产线上的流量情况,在流量接近或者超过业务预期的性能阀值后,应当尽快进行服务降级或者生产扩容等紧急措施。

链路式服务监控

中间件监控:中间件的监控平台较多,Zabbix 平台监控服务器的性能指标,包括 CPU 使用率,内存使用率,磁盘使用率,网络流量等。

Redis 监控使用 Promes 监控平台;数据库监控使用苏宁自研数据库管理平台,可实时查看数据库状态,是否存在慢 SQL 等。

异常监管及日志查看使用苏宁自研分布式日志平台,可实时查看分布式系统日志,系统中的异常情况等。

中间件监控可以发现硬件层面的问题,例如系统压力过大时造成 CPU 过高等,可以根据具体指标进行扩容或者联系系统运维解决硬件问题。

多级流控

在流量洪峰来临时,如何优先保障系统稳定呢?首先,通过性能压测等手段确认系统的最大承受能力,为每个服务&接口设定具体的流量阀值。

其后在各级流控平台进行流控配置:

  • 防火墙:防火墙主要针对 HTTP 服务进行流控,并可提供防黄牛、防网络攻击、负载控制等相关功能。
  • 服务全局流控:防火墙仅能针对 HTTP 服务进行流控,那么系统提供的 RPC 微服务接口集群流控则依赖内部流控平台,可提供系统级的全局服务流控。
  • 服务单机流控:RPC 微服务接口单节点流控配置与 RPC 服务后台,提供单机令牌式流控服务。
  • 用户级流控:以上几种流控方式均为服务级别的流控,尚无法控制单个用户的防刷操作,在这里我们开发了基于 Redis 的用户级流控,可以控制单个用户一段时间内的访问次数。

为什么要配置多种级别的流控服务呢?主要基于以下几点考虑:

  • 基于高可用的理念,防止单个流控服务出现故障时可以有其他流控进行补充。
  • 不同流控方式所控制的维度不一样,有针对 HTTP 服务的,有针对 RPC 服务的;级别也不一致,有全局和单机的,在流量控制方面做到万无一失。
  • 控制的方式不一样,有基于 TPS 控制的,也有基于令牌式控制的,还有根据时间范围内次数进行控制

系统降级

基于 Zookeeper 的分布式配置平台设置应用开关阀值,在系统压力过大时,通过开启关闭非核心应用功能,保障核心主链路的可用。

例如在发红包、抢红包的流量洪峰到来前,通过在配置平台修改开关值,可以暂时性的关闭红包消费功能(余额提现、兑券等),开关关闭后,消费功能暂时不可用,在流量洪峰消退后,打开开关,即可恢复消费功能。

打开和关闭的操作在半分钟内可以完成,快速保护红包核心主链路和恢复功能完整。

未来的挑战及方向

红包系统从 2016 年年底至今,经历了公司的数个大促,目前在业务方面,也面临着一系列的挑战:

  • 随着红包形式的多样化,业务不断提出新的红包玩法;如何在现有能力的基础上,提升系统复用性,核心服务中台化,快速兼容新的红包玩法。
  • 红包系统目前高度依赖 Redis,在现有 Redis 数据持久化的基础上,需要在代码层面进一步完善缓存数据补偿能力。
  • 目前的红包高可用部署基于一个 IDC 机房的集群部署,如果整个 IDC 机房服务都不可用的话,那么服务就需要切换到备机房,目前还无法做到无缝对接;在这种情况下,异地多活部署势在必行。

每年都会有新的红包活动,而随着苏宁易购和苏宁金融用户群体的不断扩大,红包系统面临的挑战也越来越多。

以后我们将围绕高并发,高可用,高一致性的方向,不断优化系统部署,代码结构,未来的路还很长,我们将砥砺前行。

作者:姜春峰、邢恺

简介:姜春峰,苏宁金融研发中心技术副总监,目前负责苏宁金融会员及互联网研发中心的前端、门户、内容、增长产品研发的技术管理工作。具有 8 年互联网金融领域相关研发以及技术管理经验;擅长互联网金融领域应用架构,涉猎支付、理财、保险、营销、生活服务产品等产品领域应用研发,有丰富的系统性能优化经验,具备很强的技术领导力。

邢恺,苏宁金融研发中心技术经理,主要负责苏宁金融会员及互联网研发中心的红包及营销产品线研发工作。具有 7 年软件研发工作经验;参与过苏宁集团多次红包类大促活动的开发;擅长高并发服务端系统开发架构,对构建高性能服务端系统具有比较丰富的实战经验。

原文链接:https://mp.weixin.qq.com/s/E90lS2BZ2xrwoi72t12wbg

Image placeholder
lixingyu
未设置
  30人点赞

没有讨论,发表一下自己的看法吧

推荐文章
探秘K1 Power:如何打造一台坚若磐石的高性能小型机?

熟悉服务器领域的朋友,必然对浪潮K1小型机或多或少有所了解。在当年关键业务主机市场寡头垄断的格局下,浪潮400多位工程师耗费4年时间,于2010年成功研制出了K1小型机,为市场注入一股新的血液。使得中

媒体开放日,探秘百分点认知智能战略!

2009年7月1日,数据智能技术公司百分点正式成立,今年正好是第10个年头。百分点公司新址10年间,百分点经过多次转型,逐步形成了目前的企业级(ToB)、政府级(ToG)和SaaS服务三大业务体系,服

欧洲最大MySQL用户之一,Booking.com数据库构架探秘!

吴鑫Booking.com数据库工程师TeamLead2015年加入总部位于阿姆斯特丹的Booking.com数据团队,现任数据库工程师团队负责人,主要是负责Booking.com里MySQL相关的运

探秘ASC19:首次设置的“超级团队对抗赛”究竟是什么?

4月21日,2019ASC世界大学生超级计算机竞赛(ASC19)总决赛在大连理工大学正式拉开帷幕。根据赛程,在4月23日正式竞赛之前,所有参赛队伍的主要任务是完成竞赛系统的搭建与调试,力求在3000瓦

Java字节码增强探秘

大家好,美美今天给大家推荐一篇Java字节码增强技术的文章,在实际工作中有很多应用场景。美团点评技术团队平日积累了很多这类技术原理解析和实战类的文章,未来我们会选取精华,陆续发布,敬请期待。1.字节码

高并发业务场景下的秒杀解决方案 (初探)

文章简介 本文内容是对并发业务场景出现超卖情况而写的一片解决方案。主要是利用到了Redis中的队列技术。 超卖介绍 所谓的超卖,就是我们的售卖量大于了物品的库存量。该情况一般出现在电商系统中促销类的业

架构转型先行——金融业务场景下的新一代架构实践

  赵勇中国农业银行研发中心架构管理办公室主任工程师中国农业银行研发中心架构管理办公室主任工程师,十年以上金融行业信息化架构设计与管控经验。历经互联网金融、两地三中心、分布式核心银行等大型银行系统工程

云计算下半场,从金融业变革看云原生的机遇与挑战

在数字化转型过程中,上云上平台是非常关键的一步。如今是否上云已经不需讨论,云计算在国内经过十年的发展走到了下半场,成为传统产业升级的新助力。而伴随着容器、微服务等技术的逐步成熟,云计算也走到了云原生时

区块链仍处于婴儿期,金融业是应用最多的两个领域之一

如果问你2018年什么技术比较火,答案中一定会有区块链。从春节“3点钟无眠区块链”的狂欢开始,伴随着过山车一般的币价逐渐走向沉寂,链圈、矿圈、币圈的鄙视链似乎也不再那么重要。10月24日下午过后,在国

包银消费CTO汤向军:消费金融大数据风控架构与实践

01风险在哪里1.1 信用风险根据银行业的风险理论,信用风险是指借款人因各种原因未能及时、足额偿还债权人或银行贷款而违约的可能性。信用风险的风控重点在于,甄别客户违约的原因究竟是还款能力,还是还款意愿

当金融科技遇上云原生,蚂蚁金服是怎么做安全架构的?

蚂蚁金服在过去十五年重塑支付改变生活,为全球超过十二亿人提供服务,这些背后离不开技术的支撑。在2019杭州云栖大会上,蚂蚁金服将十五年来的技术沉淀,以及面向未来的金融技术创新和参会者分享。我们将其中的

金融行业微服务架构解析

转载本文需注明出处:微信公众号EAWorld,违者必究。引言:对于微服务,每个人都有自己的理解,与互联网企业的大量落地相比,微服务在传统金融行业还没有普及,这首先是传统金融行业线上系统需求更新和版本迭

海量数据时代,金融行业数据库实践难题如何解决?

随着数字经济时代的到来,大数据、人工智能技术得到了快速发展与应用,可以说,各行各业都已全情投入到这一波数字化转型浪潮中,把握新的发展机遇,获取数字红利。其中,金融行业可以说是走在转型之路最前沿的行业之

滴滴大数据在汽车金融风控场景中的应用

桔妹导读:滴滴独有的出行场景大数据在金融领域有着非常广泛的应用前景,未来可与银行,保险,支付和理财等机构深入合作,帮助传统金融机构提升资源配置效率,降低获客和风险管理成本。出行场景大数据在交易欺诈识别

做银行家里的数据专家:ING探索大数据时代下的金融最佳实践

大数据文摘出品记者:高延6月18-21日,O’ReillyAIConference在北京召开。大会上,来自荷兰的金融公司ING的IT主管BasGeerdink带来了《关于数字驱动企业》的主题分享。进入

基于Pandas+ECharts的金融大数据可视化实现方案

前言最近无意中看到一篇文章,介绍的是在IPythonNotebook里实现ECharts的可视化效果。我个人对ECharts一直是推崇有加,是baidu发布的开源项目中我比较喜欢的一个,绝对是良心之作

AI 计算竞争升级,参访平安科技背后的硬实力

平安科技的四块科技版图,分别是云、认知、区块链和人工智能。所有的AI公司在AI领域中最核心的壁垒不是技术,因为技术都是人创造的,打磨团队就可以。核心的壁垒应该时间、业务和场景。智能科技的涌现、大数据

Ubuntu 下如何升级到 PHP 7.4 ?

期待已久的PHP7.4最新版本于2019年11月28日发布。它有很多新特性,比如 类型化属性 箭头函数 有限返回类型协方差和参数类型协方差 在数组中解包 数字文字分隔符 弱引用 允许来自toStrin

Ubuntu 下如何升级到 PHP 7.4 ?

期待已久的PHP7.4最新版本于2019年11月28日发布。它有很多新特性,比如类型化属性 箭头函数 有限返回类型协方差和参数类型协方差 在数组中解包 数字文字分隔符 弱引用 允许来自toString

Mac 升级 PHP 到 7.4 版本

Homebrew升级PHP$brewupdate $brewupgradephp $php-v重新加载服务器$sudonginx-sreload $sudoapachectlrestartValet$

UI2CODE再进化!结合Redux的框架升级!

背景UI2CODE的目标是通过分析视觉稿得到对应的代码,让AI提高开发效率。然而过去静态化页面的产出,不能得到业务场景的需求。针对于此,我们以UI2CODE自动化开发为基底,结合Redux的消息机制,

机器扭碎,强力消磁还能恢复!数据中心年年升级,废弃“云垃圾”让谷歌头大

大数据文摘出品作者:蔡婕、林安安、曹培信今年7月1日,《上海市生活垃圾管理条例》正式实施,它被称为“史上最严垃圾分类措施”。条例一出,这4种颜色的桶,就彻底改变了上海人民的生活。但是一种新型的垃圾——

AI赌神升级!无惧bluff,6人局德扑完胜世界冠军,训练只用了8天

大数据文摘出品作者:曹培信、宁静2017年年初,BrainvsAI的德州扑克人机大战在卡耐基梅隆大学(CMU)落幕,由4名人类职业玩家组成的人类大脑不敌人工智能程序Libratus。获胜后人类还遭到了

京东云和英特尔“花样”升级高性能云硬盘

数据,已成为这个时代的基调。当我们因为数据带来新的机遇而喜不自胜的时候,也常常会不可避免地遇到一些随之而来的困扰。与如何更好地使用数据相比,数据的存储和管理是更棘手的问题所在。面对海量数据爆炸式的增长

如何理解腾讯云数据库战略升级?

近日,腾讯云数据库在京正式启动战略升级,宣布未来将聚焦云原生、自治、超融合三大战略方向,以用户为中心,联接未来。并在现场面向全球用户同步发布五大战略级新品,包括数据库智能管家DBbrain、云数据库T