阿里的库存秒杀是如何实现的?

一、阿里的库存秒杀的实现

阿里有很多业务,几十上百个业务线,各自都有一些需要做抢购、秒杀、热点扣将的场景。他们都用哪些方案呢?
我看了很多资料,也找了很多人做交流,最终得到的结论是啥都有,主要总结几个主流的,在用的一些方案(主要是整体方案的介绍,具体细节就不展开说了,有的是太敏感不方便讲,有的是太复杂了先把主要的说了,后续需要的再展开):
你比如说,一些并发量没那么高,比如只有几千的,基本上是用mysql在抗的。但是你要是以为这个mysql和你用的mysql是一样的,那你会发现热点行更新在几百QPS的时候CPU就直接被拉满了。
那我们的mysql呢,是加了个自研了一个补丁(就是下面这篇文章中的技术方案),这个补丁可以识别出热点行及热点SQL,再给这些SQL分组,然后一个组内的多个SQL就可以减少加锁次数、减少B+树的遍历、以及通过组提交减少事务提交次数。就能扛更高的并发

但是如果有些场景的QPS达到数万级别了,只靠数据库肯定是不行了。于是有一些营销平台或者额度系统,就会采用分桶的策略。就是将单个1000的库存拆分成10个100的库存,这样就可以把并发提升10倍。当然,这里还需要考虑如何均匀分配,如何解决碎片,如何做分桶间调度以及如何做动态扩容等问题。然后有些团队就专门研发了库存调度系统来解决这些问题。

另外,在一些本地生活类的电商场景,比较常用的方案就是缓存+数据库的策略,也就是在缓存做预扣减,然后异缓存的不可用等问题。步通知到数据库再做扣减。这种方案就是需要考虑数据的一致性、

那对于那种需要抗几百万QPS的电商大促场景,基本上就是各种方案的结合了。热点库、SQL合并执行、缓存、以及分桶基本都是结合着来的。而且这里的缓存,又有分布式缓存、本地缓存,以及把分布式缓存和服务器部署在一起搞一个近端缓存。总之就是各种方案每一个抗一点并发,加到一起抗的就多了。

我还了解到还有一些物流的仓库管理场景,设计了自己的分布式事务+应用层排队框架,来减少在数据库层面的热点更新,方案听上去也挺牛逼的。
看了这么多之后,到底哪种方案最好?又经过77四十九天的研究,我终于悟了,适合的才是最好的。
根据具体的业务形态、并发量、团队成员的技术能力、基础建设的情况等等选择相对合适的就行了。但是不管咋说,复杂度和并发量一定是成正比的。


二、阿里的数据库能抗秒杀的原理

其实,在阿里电商的秒杀等(据我了解,淘宝、天猫、猫超、大麦等都是这么干的)场景中,主要还是基于MySQL数据库在做扣减的,主要是因为这样做最可靠了(避免了redis扣减方案中的数据不一致、少卖等问题)
但是我们都知道,数据库是抗不了热点行的并发更新的,于是阿里内部就对MSQL做了patch.
这个方案其实云上数据库RDS也支持了,所以我就可以讲了。(没开放的技术确实不敢讲,怕被请喝茶。。。)
这个技术叫做Inventory Hint,其实就是一个补丁。

(官方介绍:https://help,aliyun.com/zh/rds/apsaradb-rds-for-mysql/inventory-hint )
PS:这里主要是介绍通过lnventory Hint来提升热点更新的并发,但是并不意味着内容只用这个方案来抗热点并发,但是这个是基础,先把这个讲清楚。后续其他的方案,我也会挑一些能讲的介绍。

1、使用方法

他的用法很简单,只需要在正常的update语句中增加上特殊的hint语句就行了,如:

UPDATE /*+ COMMIT ON SUCCESS ROLLBACK ON FAIL TARGET AFFECT RON(1)*/ T
SETC=C-1
WHERE id = 1;

这里面的 COMMIT ON SUCCESSROLLBACK ON FAIL和TARGET AFFECT ROW 都是一些Hint语法:

  • COMMIT ON SUCCESS:当前语句执行成功就提交事务上下文。
  • ROLLBACK ON FAIL:当前语句执行失败就回滚事务上下文。
  • TARGET AFFECT ROW(NUMBER):如果当前语句影响行数是指定的就成功,否则语句失败。

hint:MySQL 中的"Hint"是一种特殊的语法,允许开发者向数据库引擎提供如何执行特定查询的额外信息或建议。这些提示不改变查询的结果,但可以影响查询的执行路径,比如如何选择索引、是否使用缓存等。使用Hint 的目的是为了优化查询性能。

很显然,前面我们提到的这几个hint是阿里自己支持的。所以只有内部的数据库,或者阿里云的RDS才支持。

2、原理介绍

当我们是使用 COMMIT ON SUCCES5 等hint标记了一条SOL之后,就相当于告诉MySOL内核,这行可能是热点更新。
于是,MySQL的内核层就会自动识别带此类标记的更新操作,在一定的时间间隔内,将收集到的更新操作按照主键或者唯一键进行分组,这样更新相同行的操作就会被分到同一组中。

为了进一步提升性能,在实现上,使用两个执行单元。当第一个执行单元收集完毕准备提交时,第二个执行单元立即开始收集更新操作;当第二个执行单元收集完毕准备提交时,第一个执行单元已经提交完毕并开始收集新批的更新操作,两个单元不断切换,并行执行。

根据热点行做了分组之后,就可以作进一步优化了,这个过程主要有3个关键的优化点:

3、关键优化点

3.1、减少行级锁的申请等待

在同一组中,需要更新的都是同一条记录,那么根据SQL的提交顺序,就可以排队了
然后我们只需要在第一条更新SQL(Leader)执行的时候,尝试去获取目标行的锁,如果获取成功,则开始操作。
然后这一组中后续的更新操作(Folower)也会尝试获取锁,但是会先判断是不是已经被第一条更新操作获取到了,如果是的话,那么就不需要等待,直接获取锁。
这样就可以大大降低行级锁的申请的阻塞等待时长,

3.2、减少B+树的索引遍历操作

MySQL是以B+索引的方式管理数据的,每次执行查询时,都需要遍历索引才能定位到目标数据行,数据表越大,系引层级越多,遍历时间就越长。
如果针对热点行更新操作做了分组之后,我们只需要在每组的第一条SQL执行过程中,通过遍历索引定位数据行之后就可以把这些数据行缓存到Row Cache中,并且在Row Cache进行修改。
在同组的后续操作时,也不再需要进行数据索引了,直接从Row Cache获取数据并修改就行了
这样就大大降低了B+树的索引遍历操作的耗时

3.3、减少事务提交次数

如果是没有用这种方式,我们的多条update语句会是多条事务,那么每一个事务都要单独做一次提交。
有了分组、排队、组提交之后,就只需要一组中的并发操作都执行完,然后做一次组提交即可,大大降低提交次
数。


对此,您有什么看法呢?评论区留言讨论哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/285814.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux离线部署gitLab及使用教程

一、下载gitLab的linux系统rpm包 地址:Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 找到这个最新版 点击下载 二、上传到linux系统 笔者是在windows系统下的vmware虚拟机中部署安装的,虚拟机中安装了cent…

《C++ Primer 第五版 中文版》第12章 动态内存【阅读笔记 + 个人思考】

《C Primer 第五版 中文版》第12章 动态内存【阅读笔记 个人思考】 12.1 动态内存与智能指针12.1.1 shared_ptr类 静态内存包括:初始化只读数据段,初始化读写数据段,未初始化数据和常量数据段。 详细在下面博客总结: Linux系统下…

商家如何自己零成本免费制作点餐小程序项目完整源码

现在点餐小程序成为餐饮店的标配,顾客只要扫码,即可进入小程序点餐。顾客付款后,后厨自动打印出订单并开始制作。整个过程非常方便流畅,甚至还可以免去收银(或服务)人员。那么,这种餐饮小程序要…

STM32—控制蜂鸣器(定时器)

目录 1 、 电路构成及原理图 2 、编写实现代码 main.c tim_irq.c 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 此笔记基于朗峰 STM32F103 系列全集成开发板的记录。 1 、 电路构成及原理图 定时器中断是利用定时器的计数功能(向上计数或向下计…

ChatGPTGPT4科研应用、数据分析与机器学习、论文高效写作、AI绘图技术教程

原文链接:ChatGPTGPT4科研应用、数据分析与机器学习、论文高效写作、AI绘图技术教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598798&idx2&sn014f5ae90306a3b1e8fd87ab58561411&chksmfa820329cdf58a3f72799a43016b223057fd1bd02284…

算法系列--动态规划--子序列(1)

💕"深思熟虑的结果往往就是说不清楚。"💕 作者:Mylvzi 文章主要内容:算法系列–动态规划–子序列(2) 今天带来的是算法系列--动态规划--子序列(1),是子序列问题的开篇!带大家初识子序列问题 一.什么是子序列问题 我们…

某蓝队面试经验

背景 据小道消息说今年的国护疑似提前到了五月份,所以最近也是HW面试的一个高峰期啊,这里分享一下上次长亭的蓝队面试问题(附本人的回答,仅供参考) 面试问答 1、谈谈作为蓝队护网过程使用过厂商的设备 这里我回答的…

Spring Boot整合Spring Security

Spring Boot 专栏:Spring Boot 从零单排 Spring Cloud 专栏:Spring Cloud 从零单排 GitHub:SpringBootDemo Gitee:SpringBootDemo Spring Security是针对Spring项目的安全框架,也是Spring Boot底层安全模块的默认技术…

部署Zabbix Agents添加使能监测服务器_Linux平台_Yum源/Archive多模式

Linux平台 一、从yum源脚本安装部署Zabbix-Agent,添加Linux Servers/PC 概述 Zabbix 主要有以下几个组件组成: Zabbix Server:Zabbix 服务端,Zabbix的核心组件,它负责接收监控数据并触发告警,还负责将监控数据持久化到数据库中。 Zabbix Agent:Zabbix客户端,部署在被监…

Hbase 王者荣耀数据表 HBase常用Shell命令

大数据课本: HBase常用Shell命令 在使用具体的Shell命令操作HBase数据之前,需要首先启动Hadoop,然后再启动HBase,并且启动HBase Shell,进入Shell命令提示符状态,具体命令如下: $ cd /usr/local…

Linux--进程(1)

目录 前言 1.冯诺依曼体系结构 2. 操作系统(Operator System)--第一个被加载的软件 3.进程 3.1基本概念 3.2Linux中的PCB 3.3通过系统调用创建子进程-fork初识 fork:创建一个子进程 为什么要创建子进程? fork的原理: 进一步了解fo…

关于OceanBase中旁路导入的应用分享

背景 前段时间,在用户现场协助进行OceanBase的性能测试时,我注意到用户常常需要运用 insert into select 将上亿行的数据插入到一张大宽表里,这样的批量数据插入操作每次都需要耗时半个小时左右。对这一情况,我提议用户尝试采用旁…

【UE5】动画蒙太奇简述

项目资源文末百度网盘自取 动画蒙太奇基本功能 动画蒙太奇(Animation Montage) 可以将多个 动画序列(Animation Sequences) 合并为单个资产并通过蓝图播放,还可以将一个蒙太奇动画切分为多个 蒙太奇分段(M…

Prompt-RAG:在特定领域中应用的革新性无需向量嵌入的RAG技术

论文地址:https://arxiv.org/ftp/arxiv/papers/2401/2401.11246.pdf 原文地址:https://cobusgreyling.medium.com/prompt-rag-98288fb38190 2024 年 3 月 21 日 虽然 Prompt-RAG 确实有其局限性,但在特定情况下它可以有效地替代传统向量嵌入 …

外包干了5年,技术退步明显.......

先说一下自己的情况,大专生,18年通过校招进入杭州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

DC-5靶机

一.环境搭建 1.下载地址 靶机下载地址:https://download.vulnhub.com/dc/DC-5.zip 2.虚拟机配置 切换nat模式,有问题全选重试和是,打到这了,我感觉这个配置我都不用写了,启动靶机如下图所示即可 二.开始渗透 1.信…

红黑树进阶:正向与反向迭代器的实现及map、set的封装实践

文章目录 一、引言二、红黑树迭代器设计1、迭代器的基本概念和分类2、正向迭代器设计a.迭代器结构定义b.迭代器的 与 -- 3、反向迭代器设计a.反向迭代器的必要性b.反向迭代器的实现要点 4、红黑树封装迭代器 三、使用红黑树实现Map四、红黑树实现Set五、细节理解1、 typname的使…

Linux 在线yum安装: PostgreSQL 15.6数据库

Linux 在线yum安装: PostgreSQL 15.6数据库 1、PostgreSQL数据库简介2、在线安装PostgreSQL15.63、配置 PostgreSQL的环境变量4、使用默认用户登录PostgreSQL5、配置 PostgreSQL 允许远程登录6、修改 PostgreSQL 默认端口7、创建数据库和表、远程用户zyl8、pgAdmin远…

ChatGLM3 Linux 部署

1.首先需要下载本仓库: git clone https://github.com/THUDM/ChatGLM3 2.查看显卡对应的torch 版本 官方文档说明: Start Locally | PyTorch 例如: a. 先查看显卡的CUDA版本 nvcc --version 查看对应版本 Previous PyTorch Versions …

接口测试常用工具及测试方法(基础篇)

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快 接口一般来说有两种,一种是程序内部的接口&#xff…