2019独角兽企业重金招聘Python工程师标准>>>

在「中国数据库技术大会」上,淘宝 share了「秒杀场景下MySQL的低效」,详细分析了秒杀的技术难点及改进措施,简而言之,主要就是在高并发事务请求的情况下,数据库性能由于死锁检测等因素直线下降,在这种场景下,单纯的关闭死锁检测虽然可以提升一定的性能,但这顶多是治标而已,如何治本?

淘宝给出来两个改进方法

请求排队:如果请求一股脑的涌入数据库,势必会由于争抢资源造成性能下降,通过排队,让请求从混沌到有序,从而避免数据库在协调大量请求时过载。
请求合并:甲买了一个商品,乙也买了同一个商品,与其把甲乙当做当做单独的请求分别执行一次商品库存减一的操作,不如把他们合并后统一执行一次商品库存减二的操作,请求合并的越多,效率提升的就越大。

可惜的是淘宝的这些改进方法都是通过修改MySQL源代码在数据层实现的,对芸芸众生的我们而言,简直是一个无法逾越的技术门槛!那么是否可以在应用层实现呢?

请求排队
通过Redis实现队列是一件很简单的事情,应用LIST或者ZSET就可以搞定,如果没有优先级之类需求的话,通常LIST是一个更好的选择,因为它的时间复杂度更低,当然,如果处理队列的速度足够快,那么ZSET也不错。

把请求保存到队列里之后,可以通过Gearman实现Worker来消费队列,请求的生产和消费是异步的,所以不会出现并发拥堵,但是可能发生延迟,如果出现这种情况,可以通过增加Worker的数量可以加快消费队列的速度。

让我们从头捋捋:程序收到请求,然后把请求保存到Redis队列里,Gearman通过Worker处理队列里的请求,可是处理完之后如何通知程序呢?因为整个过程是异步的,所以除非程序支持某种形式的回调,否则很难通知。

最容易想到的解决办法是在程序里通过轮询来查询请求是否已经处理完成,但这无疑会增加数据库的负载,同时程序的实时性也会大打折扣。好在我们有其它的方法,比如说Redis提供了名为BLPOP和BRPOP的方法,它尝试从一个LIST里取元素,如果LIST为空则会堵塞连接,利用这个特性我们可以实现一个简易的通知功能:程序把请求保存到Redis队列里,然后调用BLPOP或BRPOP方法等通知,因为此时LIST为空,所以会堵塞连接,与此同时Gearman的Work处理完队列里的请求后,往LIST里保存一个状态码,程序感知到这个状态码,并通过状态码判断出请求是成功还是失败。

整个过程中有一些需要注意的地方,比如说因为BLPOP和BRPOP都属于堵塞性质的操作,所以一旦队列处理速度跟不上,程序就会堆积大量连接,这可能会引起很多连锁问题:一方面可能导致内存不足,以PHP为例,一个连接通常占用10M左右,堆积一千个连接的话,10G内存就没有了;另一方面大量的连接可能耗尽端口资源,具体取决于内核参数「net.ipv4.ip_local_port_range」。此时提高处理队列的速度是唯一的出路。

其实Gearman的Jobserver本身就实现了一个队列,而且还可以将这个队列用MYSQL来代替来持久化,保证队列请求不会丢失,客户端的请求先到Jobserver队列,然后Worker是真正的连接数据的程序,Jobserver根据Worker的闲忙将队列里的任务指派给Worker去处理,Worker连接数据是有限的,这样请求就不会一下拥入数据库。

请求合并

把类似的请求合并起来是一件既简单又复杂的事情,介于本文的标题是笨法玩秒杀,我们就挑简单的说,当我们通过Gearman的Work去处理队列里的请求时,通常是弹出一个请求处理一个请求,下面我们做出一些调整,每次不再只从队列里弹出一个请求,取而代之,我们一次性从队列里取出多个请求,然后在程序里完成合并后再执行。当然这里有很多细节问题,由于篇幅关系就不多说了。

转载于:https://my.oschina.net/pingjiangyetan/blog/597955

秒杀场景下MySQL的低效原因和改进相关推荐

  1. mysql去掉秒杀场景_秒杀场景下mysql减库存逻辑优化

    [问题背景] 某天早上做活动,流量大量增长,导致大量更新库存操作失败. 操作mysql返回的错误均为"Lost Connection to mysql server",即mysql ...

  2. 不同场景下MySQL的迁移方案

    文章目录 不同场景下MySQL的迁移方案 一 .为什么要迁移 生产环境中,有以下情况需要做迁移工作,如下: 二.MySQL 迁移方案概览 三.MySQL 迁移实战 3.1. 场景一:一主一从结构迁移从 ...

  3. 并发场景下MySQL存在的问题及解决思路

    转载自 并发场景下MySQL存在的问题及解决思路 目录 1.背景 2.表锁导致的慢查询的问题 3.线上修改表结构有哪些风险? 4.一个死锁问题的分析 5.锁等待问题的分析 6.小结 一.背景 对于数据 ...

  4. 聚美优品张川:如何搭建秒杀场景下的运维架构

    2016年8月12日-13日,由CSDN重磅打造的互联网应用架构实战峰会.运维技术与实战峰会将在成都举行. 这是继SDCC 2016架构技术峰会(上海站,官网.图文直播.架构峰会PPT.数据库峰会PP ...

  5. 秒杀场景下超卖问题解决方案

    秒杀超卖现象:在高并发下,多个线程并发更新库存,导致库存为负的情况. 我搜集了一些资料,整理了一下,秒杀可选方案主要有以下三种: 1.超卖原因 一个简单的订单表 create table orders ...

  6. 秒杀场景下如何保证数据一致性?就这个问题我给出了最详细的方案

    本文主要讨论秒杀场景的解决方案. 什么是秒杀? 从字面意思理解,所谓秒杀,就是在极短时间内,大量的请求涌入,处理不当时容易出现服务崩溃或数据不一致等问题的高并发场景. 常见的秒杀场景有淘宝双十一.网约 ...

  7. 多场景下MySQL临时表的作用

    墨墨导读:MySQL临时表在很多场景中都会用到,比如用户自己创建的临时表用于保存临时数据,以及MySQL内部在执行复杂SQL时,需要借助临时表进行分组.排序.去重等操作.下面将会对MySQL临时表的一 ...

  8. mysql 迁移方案_不同场景下 MySQL 的迁移方案

    本文内容 为什么要迁移 MySQL 迁移方案概览 MySQL 迁移实战 注意事项 技巧 总结 一.为什么要迁移 MySQL 迁移是 DBA 日常维护中的一个工作.迁移,是把实际存在的物体挪走,保证该物 ...

  9. mysql 存储时间 时间戳_具体场景下MySQL中用“时间戳”存储时间的问题

    今天看二哥写的关于数据库中时间戳存储的问题,觉得有必要思考下这个问题,之前自己也是认为用int型将时间存储在数据库是个不错的选择,但是我们往往理想化或者没有考虑特殊情景. 假如有这么一个场景:一个商城 ...

  10. 杨德华 mysql_杭州数列科技杨德华——MySQL秒杀场景优化

    1.MySQL/Percona 5.6/5.7 秒杀场景优化 杨德华@PHPCON 2017 2.个⼈人介绍 • 杨德华 • 曾供职于阿⾥里里集团数据库技术团队 • 经历5年年双⼗十⼀一MySQL⼤大 ...

最新文章

  1. python网络爬虫的基本步骤-十分钟教会你用Python写网络爬虫程序
  2. 【arduino】nodemcu(ESP8266)发送邮件库测试笔记,SMTP email
  3. C++ 中的 new/delete 和 new[]/delete[]
  4. python web 框架(八)-- Scrapy
  5. 转:Java并发编程与高并发解决方案(一)
  6. 方法~作用于对象~失败_消息三:ActiveMQ Topic 消息失败重发
  7. postgresql报错 :FATAL: no pg_hba.conf entry for host 192.168.163.130,user postgres,database pos
  8. 电脑进不了系统怎么重装系统win11
  9. hive学习4(hive的脚本执行)
  10. VC14(VC2015)安装失败,0x80240017 - 未指定的错误,解决办法
  11. 一个功能简洁,使用简易的微信机器人
  12. 想转行it , 培训还是自学?
  13. java设计模式总结之六大设计原则(有图有例子)
  14. 互联网地图栅格比例尺(3857,4326)
  15. 一个男人的一生应该有几个女人?
  16. Linux(2)---Crtl+z与Crtl+c
  17. 精品收藏:GitHub人工智能AI开源项目
  18. android dp不同高度,Android获取屏幕的宽度和高度(dp)
  19. Flatten()详解
  20. 新特性解读 | MySQL 8.0 对 GTID 的限制解除

热门文章

  1. Eclipse插件大全 挑选最牛的TOP30
  2. 初入职场,你够聪明不?
  3. 解决“HTTP Error 401 – Unauthorized”
  4. linux内核双向链表学习
  5. Android UI学习之CheckBox
  6. WifiConnectivityManager 管理扫描
  7. SQlite数据库的C编程接口(五) 便捷函数(Convenience Functions) ——《Using SQlite》读书笔记
  8. linux在多核处理器上的负载均衡原理(2)
  9. 1059 Prime Factors (25 分)水
  10. 入门级都能看懂的softmax详解