一、抢购秒杀处理方案

特点:秒杀活动对稀缺或者特价的商品进行定时定量售卖,吸引成大量的消费者进行抢购,但又只有少部分
消费者可以下单成功。因此,秒杀活动将在较短时间内产生比平时大数十倍,上百倍的页面访问流量
和下单请求流量。

秒杀3阶段
1、秒杀前:用户不断刷新商品详情页,页面请求达到瞬间峰值
2、秒杀开始:用户点击秒杀按钮,下单请求达到瞬时峰值
3、秒杀后:少部分成功下单的用户不断刷新订单或者退单,大部分用户继续刷新商品详情页等待机会

本质:抢购/秒杀主要是解决热点数据高并发读写的问题。

裁剪:抢购/秒杀的过程就是一个不断对请求 ‘剪枝叶’ 的过程。
1、尽可能减少用户到应用服务端的读写请求(客户端做一部分拦截)
2、应用到达服务端的请求要减少对后端存储系统访问(服务端LocalCache拦截一部分)
3、需要请求存储系统的请求尽可能减少对数据库的访问(使用redis拦截绝大多数)
4、最终的请求达到数据库(也可以做一个消息队列兜底、万一后端存储无响应,应用服务器要有兜底方案)

基本原则
1、数据少(静态化、CDN、前端资源合并,页面动静分离,LocalCache)
2、路径短(前端到末端路径可能端、尽量减少对不同系统的依赖,支持限流降级)
3、禁单点(应用服务器无状态化水平扩展、存储服务避免热点)

扣减库存的时机
1、下单减库存(避免恶意下单不付款,保证大并发请求库存数量数据不能负数)
2、付款减库存(下单成功付不了款影响体验)
3、预扣库存超时释放(可以结合Quartz、xxl-job等框架进行清理超时库存,还有做好安全和反作弊)

Redis实现方案
1、String结构:直接使用incr/decr/incrby/decrby,注意:redis目前不支持上下界的限制、如果要避免负数或者关联关系的库存sku扣减只能使用Lua。
2、List结构:每一个商品是一个List,每一个Node是一个库存单元、扣减库存使用lpop/rpop命令,直接返回nil(key not exist)
3、Set/Hash结构:一般用来去重,现在用户只能购买指定格式(hincrby 计数,hget 判断已购买数量)、注意要把用户 UID 映射到多个 key 来读写,一定不能都放到某一个 key 里(热点)
4、业务场景允许情况下,热点商品可以使用多个key、随机选择、用户UID做映射(不同的用户等级也可以设置不同的库存量)

TairString:支持高并发CAS的String
1、携带Version得String:保证并发更新的原子性、通过Version来实现更新,乐观锁、不能与Redis普通String混用
2、使用exIncr/exIncrBy:抢购/秒(有上下界)
3、exSet->exCAS:减少网络交互

二、分析热点数据(JDhotkey)

热点数据产生原因:在拥有大量并发用户的系统中,热key一直以来都是一个不可避免的问题。或许是突然某些商品成了爆款,或许是海量用户突然涌入某个店铺,或许是秒杀时瞬间大量开启的爬虫用户, 这些突发的无法预先感知的热key都是系统潜在的巨大风险。

热点数据有哪些
1 、MySQL等数据库会被频繁访问的热数据
如爆款商品的skuId。
2 、redis的被密集访问的key
如爆款商品的各维度信息,skuId、shopId等。
3 、机器人、爬虫、刷子用户
如用户的userId、uuid、ip等。
4 、某个接口地址
如sku/query或者更精细维度的。
5、 用户id+接口信息
如userId + /sku/query,这代表某个用户访问某个接口的频率。
6 、服务器id+接口信息
如ip + /sku/query,这代表某台服务器某个接口被访问的频率。
7 、用户id+接口信息+具体商品
如userId + /sku/query + skuId,这代表某个用户访问某个商品的频率。

核心功能:热数据探测并推送至集群各个服务器

1 mysql热数据本地缓存
2 redis热数据本地缓存
3 黑名单用户本地缓存
4 爬虫用户限流
5 接口、用户维度限流
6 单机接口、用户维度限流
7 集群用户维度限流
8 集群接口维度限流

热点数据解决方法

我们分别以redis的热key、刷子用户、限流等典型的场景来看。

Redis热key:(本地缓存+淘汰策略或者热点key时推送到jvm)

这种以往的解决方式比较百花齐放,比较常见的有:
1)上二级缓存,读取到redis的key-value信息后,就直接写入到jvm缓存一份,设置个过期时间,设置个淘汰策略譬如队列满时淘汰最先加入的。或者使用guava cache或caffeine cache进行单机本地缓存,整体命中率偏低。
2)改写redis源码加入热点探测功能,有热key实时推送到jvm。问题主要是不通用,且有一定难度。
3)改写jedis、letture等redis客户端的jar,通过本地计算来探测热点key,是热key的就本地缓存起来并通知集群内其他机器。
4)其他
刷子爬虫用户:
常见的有:
1)日常累积后,将这批黑名单通过配置中心推送到jvm内存。存在滞后无法实时感知的问题。
2)通过本地累加,进行实时计算,单位时间内超过阈值的算刷子。如果服务器比较多,存在用户请求被分散,本地计算达不到甄别刷子的问题。
3)引入其他组件如redis,进行集中式累加计算,超过阈值的拉取到本地内存。问题就是需要频繁读写redis,依旧存在redis的性能瓶颈问题。

限流
1)单机维度的接口限流多采用本地累加计数
2)集群维度的多采用第三方中间件,如sentinel
3)网关层的,如Nginx+lua

综上,我们会发现虽然它们都可以归结到热key这个领域内,但是并没有一个统一的解决方案,我们更期望于有一个统一的框架,它能解决所有的对热key有实时感知的场景,最好是无论是什么key、是什么维度,只要我拼接好这个字符串,把它交给框架去探测,设定好判定为热的阈值(如2秒该字符串出现20次),则毫秒时间内,该热key就能进入到应用的jvm内存中,并且在整个服务集群内保持一致性,要有都有,要删全删。

优势

热key问题归根到底就是如何找到热key,并将热key放到jvm内存的问题。只要该key在内存里,我们就能极快地来对它做逻辑,内存访问和redis访问的速度不在一个量级。
譬如刷子用户,我们可以对其屏蔽、降级、限制访问速度。热接口,我们可以进行限流,返回默认值。redis的热key,我们可以极大地提高访问速度。
以redis访问key为例,我们可以很容易的计算出性能指标,譬如有1000台服务器,某key所在的redis集群能支撑20万/s的访问,那么平均每台机器每秒大概能访问该key200次,超过的部分就会进入等待。由于redis的瓶颈,将极大地限制server的性能。
而如果该key是在本地内存中,读取一个内存中的值,每秒多少个万次都是很正常的,不存在任何数据层的瓶颈。当然,如果通过增加redis集群规模的形式,也能提升数据的访问上限,但问题是事先不知道热key在哪里,而全量增加redis的规模,带来的成本提升又不可接受。

参考:https://gitee.com/jd-platform-opensource/hotkey

参考:https://developer.aliyun.com/learning/trainingcamp/redis/1

抢购秒杀处理方案、分析热点数据相关推荐

  1. 限时抢购秒杀系统架构分析与实战

    1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单:(5)付款:(6)卖家发货 秒杀业务的特性 (1)低廉价格:(2)大幅推广:(3)瞬时售空:(4)一 ...

  2. 电商抢购秒杀系统的设计_1_应用场景分析

    2019独角兽企业重金招聘Python工程师标准>>> 电商抢购秒杀系统的设计_1_应用场景分析 概述 所谓知已知彼,百战不殆,在开始详细介绍实战中的抢购秒杀系统时,我们了解一些抢购 ...

  3. 小工匠聊架构-超高并发秒杀系统设计 03_热点数据的处理

    文章目录 Pre 热点数据 静态热点数据 VS 动态热点数据 发现热点数据 发现静态热点数据 发现动态热点数据 动态热点探测架构 注意事项 处理热点数据 优化 限制 隔离 总结 Pre 小工匠聊架构- ...

  4. 服务器接地位置,idc数据服务器机房搬迁防雷接地案例方案分析

    idc数据服务器机房搬迁防雷接地案例方案分析 (1).概况 根据用户需求,拟在指挥办公楼做保护地网系统.因通信idc数据服务器机房搬迁.师蓝军指挥所.自动化idc数据服务器机房搬迁.信息中心idc数据 ...

  5. 秒杀系统优化方案(下)吐血整理

    接上篇秒杀系统优化方案(上)吐血整理 3. 深入优化设计 3.1   初始方案问题分析 在前面针对数据库的优化中,由于数据库行级锁存在竞争造成大量的串行阻塞,我们使用了存储过程(或者触发器)等技术绑定 ...

  6. 美团技术总监分享:高并发系统的设计及秒杀实践原理分析

    一个大型网站应用一般都是从最初小规模网站甚至是单机应用发展而来的,为了让系统能够支持足够大的业务量,从前端到后端也采用了各种各样技术,前端静态资源压缩整合.使用CDN.分布式SOA架构.缓存.数据库加 ...

  7. 转:秒杀系统架构分析与实战

    原文出处: 陶邦仁   欢迎分享原创到伯乐头条 0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单: ...

  8. 【转】秒杀系统架构分析与实战

    0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单:(5)付款:(6)卖家发货 秒杀业务的特性 (1 ...

  9. 秒杀系统架构分析与实战 for java

    秒杀系统架构分析与实战 for java 标签: 系统架构架构设计数据库 2016-01-18 16:35 2435人阅读 评论(0) 收藏 举报 目录(?)[+] 目录[-] 0 系列目录 1 秒杀 ...

  10. [转]秒杀系统架构分析与实战

    原文出处:  陶邦仁   欢迎分享原创到 伯乐头条 0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程(1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单 ...

最新文章

  1. Oracke nls Parameters
  2. map集合怎么取value值最大的前三_Java之集合(下)
  3. Arria10_emif
  4. Android Studio 上Activity的互相切换
  5. 模板上 php dede,DEDE模板中使用php和if判断语句实例
  6. 剑指Offer之求解1+2+....+n
  7. 按照这个步骤来刷题,迷茫的你两个月亦能成为王者
  8. 用SQL表达内连接和外链接
  9. 类似地图比例尺钩子下边框实现
  10. sql优化的几种方法
  11. kdj买卖指标公式源码_大智慧KDJ买卖指标公式(选股公式/源码)
  12. 线性表的链式存储结构 ( 链表 )
  13. 如何使用github上传代码
  14. zyf的童年(异或运算的运用)
  15. 年后跳槽,你准备好在编程面试中一举拿下高薪了吗?
  16. Beyond Compare 过期解决办法
  17. linux下装go环境
  18. 卡贴机变无锁教程_如何让“有锁”iPhone变“无锁”?“有锁”iPhone变“无锁”设置教程...
  19. 6.信息论(一):信息量、熵和最优编码
  20. python 收音机

热门文章

  1. 图像处理:理想低通滤波器、butterworth滤波器(巴特沃斯)、高斯滤波器实现(python)
  2. Git 提交大文件提示 fatal: The remote end hung up unexpectedly
  3. python基本函数的导数公式_算法中的微积分:5大函数求导公式让你在面试中脱颖而出...
  4. overload java_Java方法重载Overload原理及使用解析
  5. 【Zigbee】基础篇(4) Zigbee无线通信过程、无线发送温湿度信息
  6. python实现网页表单填写_python在网页中自动填充表单
  7. xsmax无法进入dfu模式_iPhoneXS/XSMax如何强制重启?如何进入恢复模式或DFU模式?...
  8. Boni Satani谈迁移遗留系统的5个原因
  9. Android studio更换主题、背景图片
  10. VUE-日期选择器-结束时间开始时间