阿里双11大促秒杀活动下的缓存技术与高水位限流实现

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 秒杀最早来自天猫双11各种商品的促销活动中,现在已经有很多业务场景在使用,比如抢红包,抢票等。其特点有三高:瞬时并发高,数据一致性高,热点更新频度高。这样三高的场景下往往给数据库造成极大的压力,大量更新数据库中的同一行,这样必然会产生锁等待,导致数据库的性能急剧下降的问题,很容出现雪崩效应。

秒杀最早来自天猫双11各种商品的促销活动中,现在已经有很多业务场景在使用,比如抢红包,抢票等。其特点有三高:瞬时并发高,数据一致性高,热点更新频度高。这样三高的场景下往往给数据库造成极大的压力,大量更新数据库中的同一行,这样必然会产生锁等待,导致数据库的性能急剧下降的问题,很容出现雪崩效应。

记得有一年春节,一个电视台定时在整点发放红包,结果由于压力太高,导致更新数据库红包数额的请求全部堆积,业务全部挂掉,面对这样的情况我们当时也束手无策。

面对秒杀业务的场景,数据库成为了底层系统中最重要的瓶颈点,阿里经过几年的沉淀也诞生了很多的技术手段来进行优化。主要包括以下几个方面:

1 业务流程优化
2 访问来源优化
3 流量控制

业务流程优化

以淘宝的交易订单为例,在共享服务平台模式下,订单创建流程需要调用超过200个服务,如果以严格的顺序调用的方式,哪怕每一个服务调用都控制在20ms以内,那么完成一个订单也需要4s的时间,远远超过了用户的忍耐极限。

另外,顺序调用会导致对系统资源的过度占用,给服务器整体的吞吐量产生巨大影响。

因此,对于有严格先后顺序的服务保持顺序调用,对于能够同步执行的服务均采用异步化的方式处理。

从数据库层面,实现的核心技术就是采用数据库事务的异步化。也就是将大事务拆分成小事务,同样根据以上原则,进行相对异步化处理。(在该过程中,最重要的是要控制程序或者业务异常时,不会导致结果不一致,或支持有效的回滚和重试机制。)

访问来源优化

在传统的数据库访问中,一次SSD盘数据访问在几十微秒,一次SATA盘数据访问在几十毫秒,而内存数据库的操作时间是纳秒级的,因此通过缓存技术改变业务访问的数据来源从而提高系统性能和吞吐量的技术被各大企业的互联网应用广泛使用。

淘宝在业务的发展过程中,也不断通过缓存技术的研究和应用的改进高性能。

早期通过缓存实现应用分布式session,以避免应用实例间会话的复制,后来发展为将缓存用于业务去重判断、交易快照、图片索引等场景,最后 替换数据库在业务交易处理中的职能。缓存在业务中扮演越来越重要的角色。

流量控制

接下来我们重点讲一下底层数据所做的优化。当大量的并发更新同一条记录时,使用排队的方式来保证高并发下热点记录更新依然能保持较好的性能,为threads_running设置一个硬上线,当并发超过此值是,拒绝执行sql,保护MySQL,我们将这个称之为高水位限流,这样就给数据库加上了一层限流的功能,使得数据库不被瞬间的高爆发请求打爆。

高水位限流实现:

监控系统status变量threads_running,当满足拒绝条件,拒绝执行sql,返回用户:MySQL Server is too busy,判断逻辑在dispatch_command中,sql解析之后。

增加的系统variables:

1.threads_running_ctl_mode: 限流的sql类型,有两个取值:[ALL | SELECTS],默认SELECTS,设置为ALL需谨慎。

2.threads_running_high_watermark: 限流水位值,只有threads_running超过此值才会触发,默认值为max_connections,当set global threads_running_high_watermark=0时自动设置为max_connections。


拒绝必要条件:

1..threads_running超过threads_running_high_watermark。

2..threads_running_ctl_mode与sql类型相符。

以下情况不拒绝:

1.用户具有super权限。

2.sql所在事务已经开启。

3.sql为commit/rollback。

阿里云的RDS已经集成了阿里秒杀场景下的参数优化,所以如果你的应用场景中具有大量并发更新同一行记录的场景,可以打开数据库的限流参数:threads_running_ctl_mode和threads_running_high_watermark来保护数据库,让数据库平稳过渡。

下面我们来看一则生产案例。

f88bb897b1fd39856e2340f5505bc01a94b27bbf

从上图中看到该数据库的活跃连接数最高的时候到达了1W,通过show processlist可以看到大量的并发更新

3b453927c6b6ed1e80b4e76df22ce62be46ea662

我们来看一下数据库并发更新的TPS有多大:

fc6e798d2c7f61461b30312b1519c8826f5b6dbb

可以看到数据库中的活跃连接数非常高,每秒的update非常不稳定。

我们在把限流开关打开后看一下性能表现:

mysql> set global  rds_threads_running_high_watermark=300;

Query OK, 0 rows affected (0.00 sec)

mysql> set global  rds_threads_running_ctl_mode='all';

Query OK, 0 rows affected (0.00 sec)

f9cd688de2f5d47aa4969284abf9de4703371535

从上图可以明显的观察到,通过打开数据库的限流开关,数据库的活跃连接数在300左右,同时数据库的TPS也没有再出现很大的波动,这样很好的保护住了DB。

23e8d5a5fb97aa1bdd0f0070aff79276d4e9e8e0

双11至今为止发展为中国乃至全球最成功的大型促销活动。用户对系统性能的极致追求业务的巨大压力给整个系统的建设和运维管控都提出了很高的要求。而阿里正是在这样的大促秒杀活动中,积累了相当丰富的架构设计经验和平台开发能力。


原文发布时间为:2018-02-6

本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”微信公众号

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
24天前
|
缓存 NoSQL Java
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
Spring Cache 是 Spring 提供的简易缓存方案,支持本地与 Redis 缓存。通过添加 `spring-boot-starter-data-redis` 和 `spring-boot-starter-cache` 依赖,并使用 `@EnableCaching` 开启缓存功能。JetCache 由阿里开源,功能更丰富,支持多级缓存和异步 API,通过引入 `jetcache-starter-redis` 依赖并配置 YAML 文件启用。Layering Cache 则提供分层缓存机制,需引入 `layering-cache-starter` 依赖并使用特定注解实现缓存逻辑。
127 1
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
|
2月前
|
存储 缓存 算法
深入了解Memcached:缓存技术的利器
Memcached是一个开源的高性能分布式内存缓存系统,用于加速动态Web应用。它通过将数据库查询结果、API调用结果或其他数据缓存到内存中,减少对数据库的访问频率,从而提高应用的响应速度。本文详细介绍了Memcached的基本原理、架构、安装配置、使用方法、测试方法以及应用场景。通过Memcached,开发者可以有效提升Web应用的性能,减少数据库负载,改善用户体验。
28 5
|
2月前
|
开发者 Sentinel 微服务
高并发架构设计三大利器:缓存、限流和降级问题之降级策略中的有限状态机的三种状态切换的问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之降级策略中的有限状态机的三种状态切换的问题如何解决
|
2月前
|
监控 应用服务中间件 nginx
高并发架构设计三大利器:缓存、限流和降级问题之Nginx的并发连接数计数的问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Nginx的并发连接数计数的问题如何解决
|
2月前
|
应用服务中间件 nginx 缓存
高并发架构设计三大利器:缓存、限流和降级问题之Nginx作为前置网关进行限流问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Nginx作为前置网关进行限流问题如何解决
|
2月前
|
监控 算法 Java
高并发架构设计三大利器:缓存、限流和降级问题之配置Sentinel的流量控制规则问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之配置Sentinel的流量控制规则问题如何解决
|
2月前
|
监控 Sentinel 缓存
高并发架构设计三大利器:缓存、限流和降级问题之RateLimiter的acquire()方法有什么作用
高并发架构设计三大利器:缓存、限流和降级问题之RateLimiter的acquire()方法有什么作用
|
2月前
|
存储 算法 缓存
高并发架构设计三大利器:缓存、限流和降级问题之使用RateLimiter来限制操作的频率问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之使用RateLimiter来限制操作的频率问题如何解决
|
2月前
|
存储 算法 Java
高并发架构设计三大利器:缓存、限流和降级问题之滑动日志算法问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之滑动日志算法问题如何解决
|
2月前
|
算法 Java 调度
高并发架构设计三大利器:缓存、限流和降级问题之使用Java代码实现令牌桶算法问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之使用Java代码实现令牌桶算法问题如何解决
下一篇
云函数