秒杀活动场景

淘宝双11秒杀场景,大量的用户短时间内涌入,瞬间流量巨大(高并发),比如:1000万人同一时间抢购100件商品。秒杀活动是一个特别考验后台数据库、缓存服务的业务,对于数据库、缓存的性能要求特别严格。

秒杀背后的技术挑战

1、突增的服务器及网络需求

通常情况下,双 11 的服务器使用是平时的 3-5 倍,网络带宽是平时 N倍。

2、业务高并发,服务负载重

我们通常衡量一个 Web 系统的吞吐率的指标是 QPS(Query Per Second,每秒处理请求数),解决每秒数万次的高并发场景,这个指标非常关键。

假设处理一个业务请求平均响应时间为 100 ms,同时,系统内有 20 台 Web 服务器,配置最大连接数为 500 个,Web 系统的理论峰值 QPS 为(理想化的计算方式):100000 (10万QPS)意味着1 秒钟可以处理完 10 万的请求,而“秒杀”的那 5w/s 的秒杀似乎是“纸老虎”。

实际情况,在高并发的实际场景下,服务器处于高负载的状态,网络带宽被挤满,在这个时候平均响应时间会被大大增加。随着用户数量的增加,数据库连接进程增加,需要处理的上下文切换也越多,服务器造成负载压力越来越重。

3、业务耦合度高,引起系统“雪崩”

更可怕的问题是,当系统上某个应用因为延迟而变得不可用,用户的点击越频繁,恶性循环最终导致“雪崩”,因为其中一台服务器挂了,导致流量分散到其他正常工作的机器上,再导致正常的机器也挂,然后恶性循环,将整个系统拖垮。

如何解决秒杀技术瓶颈

秒杀架构设计思路:

将请求拦截在系统上游,降低下游压力:秒杀系统特点是并发量极大,但实际秒杀成功的请求数量却很少,所以如果不在前端拦截很可能造成数据库读写锁冲突,甚至导致死锁,最终请求超时。

充分利用缓存(redis):利用缓存可极大提高系统读写速度。

消息中间件(ActiveMQ、Kafka等):消息队列可以削峰,将拦截大量并发请求,这也是一个异步处理过程,后台业务根据自己的处理能力,从消息队列中主动的拉取请求消息进行业务处理。

前端设计方案

  • 页面静态化:将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过CDN来抗峰值。
  • 禁止重复提交:用户提交之后按钮置灰,禁止重复提交
  • 用户限流:在某一时间段内只允许用户提交一次请求,比如可以采取IP限流

后端设计方案

  • 服务端控制器层(网关层)
  • 限制uid(UserID)访问频率:我们上面拦截了浏览器访问的请求,但针对某些恶意攻击或其它插件,在服务端控制层需要针对同一个访问uid,限制访问频率。
  • 服务层

上面只拦截了一部分访问请求,当秒杀的用户量很大时,即使每个用户只有一个请求,到服务层的请求数量还是很大。比如我们有100W用户同时抢100台手机,服务层并发请求压力至少为100W。

  • 采用消息队列缓存请求:既然服务层知道库存只有100台手机,那完全没有必要把100W个请求都传递到数据库啊,那么可以先把这些请求都写到消息队列缓存一下,数据库层订阅消息减库存,减库存成功的请求返回秒杀成功,失败的返回秒杀结束。
  • 利用缓存应对读请求:比如双11秒杀抢购,是典型的读多写少业务,大部分请求是查询请求,所以可以利用缓存分担数据库压力。
  • 利用缓存应对写请求:缓存也是可以应对写请求的,比如我们就可以把数据库中的库存数据转移到Redis缓存中,所有减库存操作都在Redis中进行,然后再通过后台进程把Redis中的用户秒杀请求同步到数据库中。

数据库层

数据库层是最脆弱的一层,一般在应用设计时在上游就需要把请求拦截掉,数据库层只承担“能力范围内”的访问请求。所以,上面通过在服务层引入队列和缓存,让最底层的数据库高枕无忧。

比如:利用消息中间件和缓存实现简单的秒杀系统

Redis是一个分布式缓存系统,支持多种数据结构,我们可以利用Redis轻松实现一个强大的秒杀系统。

我们可以采用Redis 最简单的key-value数据结构,用一个原子类型的变量值(AtomicInteger)作为key,把用户id作为value,库存数量便是原子变量的最大值。对于每个用户的秒杀,我们使用 RPUSH key value插入秒杀请求, 当插入的秒杀请求数达到上限时,停止所有后续插入。

然后我们可以在台启动多个工作线程,使用 LPOP key 读取秒杀成功者的用户id,然后再操作数据库做最终的下订单减库存操作。

当然,上面Redis也可以替换成消息中间件如ActiveMQ、Kafka等,也可以将缓存和消息中间件 组合起来,缓存系统负责接收记录用户请求,消息中间件负责将缓存中的请求同步到数据库。

秒杀架构设计总结:

限流: 鉴于只有少部分用户能够秒杀成功,所以要限制大部分流量,只允许少部分流量进入服务后端。

削峰:对于秒杀系统瞬时会有大量用户涌入,所以在抢购一开始会有很高的瞬间峰值。高峰值流量是压垮系统很重要的原因,所以如何把瞬间的高流量变成一段时间平稳的流量也是设计秒杀系统很重要的思路。实现削峰的常用的方法有利用缓存和消息中间件等技术。

异步处理:秒杀系统是一个高并发系统,采用异步处理模式可以极大地提高系统并发量,其实异步处理就是削峰的一种实现方式。

内存缓存:秒杀系统最大的瓶颈一般都是数据库读写,由于数据库读写属于磁盘IO,性能很低,如果能够把部分数据或业务逻辑转移到内存缓存,效率会有极大地提升。

可拓展:当然如果我们想支持更多用户,更大的并发,最好就将系统设计成弹性可拓展的,如果流量来了,拓展机器就好了。像淘宝、京东等双十一活动时会增加大量机器应对交易高峰。

阿里P8架构师谈(1):双11秒杀系统如何设计相关推荐

  1. 阿里P8架构师谈:Dubbo的详细介绍、设计思路、以及4大适用场景

    Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用 ...

  2. 阿里P8架构师谈:架构设计经验汇总

    架构设计更多的是实践经验总结,以下架构设计经验,我会陆续补充完整. 一:数据库拆分原则 阿里P8架构师谈:架构设计之数据库拆分六大原则 二:缓存选择原则 阿里P8架构师谈:分布式缓存的应用场景.选型比 ...

  3. 阿里P8架构师谈:什么是缓存雪崩?服务器雪崩的场景与解决方案

    什么是应用服务雪崩 雪崩问题 分布式系统都存在这样一个问题,由于网络的不稳定性,决定了任何一个服务的可用性都不是 100% 的.当网络不稳定的时候,作为服务的提供者,自身可能会被拖死,导致服务调用者阻 ...

  4. 阿里P8架构师谈:高并发网站的监控系统选型、比较、核心监控指标

    在高并发分布式环境下,对于访问量大的业务.接口等,需要及时的监控网站的健康程度,防止网站出现访问缓慢,甚至在特殊情况出现应用服务器雪崩等场景,在高并发场景下网站无法正常访问的情况,这些就会涉及到分布式 ...

  5. 阿里P8架构师谈:分布式架构设计12精讲

    分布式架构设计包含: 分布式缓存 分布式消息中间件 分库分表.读写分离 单点登录等 想成为阿里160万年薪的P8架构师?你必须掌握如下6大技能体系! 阿里P8架构师谈:分布式架构系统拆分原则.需求.微 ...

  6. 阿里P8架构师谈:主流RPC框架详解,以及与SOA、SOAP、REST的区别

    什么是RPC RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 简言之,RPC使 ...

  7. 阿里P8架构师谈:Docker简介、组成架构、使用步骤、以及生态产品

    Docker简介 Docker是DotCloud开源的.可以将任何应用包装在Linux container中运行的工具. Docker基于Go语言开发,代码托管在Github上,目前超过10000次c ...

  8. 阿里P8架构师谈:分布式、集群、负载均衡、分布式数据一致性的区别与关联

    服务器集群: 1.集群概念 集群就是一组相互独立的计算机,通过高速的网络组成一个计算机系统.服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器. 2.集群的特点和 ...

  9. 阿里P8架构师谈:数据库、JVM、缓存、SQL等性能调优方法和原则

    编辑 性能优化基本是BAT等一线互联网公司程序员必备的技能,以下为大家完整揭晓性能完整的优化方案和方法:包含web网站调优.数据库.JVM调优.架构调优等方案. 第一:Web网站调优 1.尽可能减少H ...

  10. 阿里P8架构师谈:java架构师面试技能24全点

    1,JAVA基础扎实,理解io.多线程.集合等基础框架,对JVM原理有一定的了解,熟悉常见类库,常见java api不仅会用更能知其所以然: 2,对Spring,MyBatis/Hibernate,S ...

最新文章

  1. 软件工程个人作业01
  2. Spring Boot下Druid连接池的使用配置分析
  3. vue + element-ui 聊天_Vue管理后台框架选择推荐
  4. javascrip部分
  5. 8421转换法可以轻松实现各进制之间的转换
  6. (转)Linux系统中sysctl命令详解 sysctl -p、sysctl -a、sysctl -w
  7. Flutter之BottomSheet
  8. 信号与系统学习之第一章(系统的六大基本性质定义与判别:无记忆性、可逆性、因果性、稳定性、时不变性、线性)
  9. 进程之间的通信(管道详解)
  10. Unity2017 经典游戏开发教程 算法分析与实现 (张帆 著)
  11. 1949年的国庆节(10月1日)是星期六.......
  12. 使用IDEA创建一个Solidity项目
  13. TP-Link ER系列路由器下挂路由器设置VLAN方法
  14. linux12 -MYSQL数据库 --> 19数据库面试必备手册
  15. spring boot 运行提示:Process finished with exit code 1
  16. 照片变成二次元动漫(2)
  17. 我居然又回来了……(bushi灰太狼,之前拾贝,没坚持下去)
  18. Atcoder #2362 Splatter Painting(dfs+优化)
  19. 体验高空跳伞,3DMark Sky Drive场景测试
  20. 元宇宙产业委共同主席倪健中:打开元宇宙的潘多拉魔盒,释放元宇宙产业无限的想象与发展空间|平安银行元宇宙与新终端创新沙龙

热门文章

  1. 记flume部署过程中遇到的问题以及解决方法(持续更新)
  2. 《财富》封面文章:重新审视世界500强,它们又卷土重来了
  3. C++ 插件机制的实现原理、过程、及使用
  4. 山药粥营养价值好处有哪些 山药粥的功效与作用
  5. 【千锋】网络安全学习笔记(三)
  6. 2022年中考英语热点话题作文预测(满分范文15篇)
  7. 英国大不列颠百科全书_大不列颠计划通过社区编辑接受维基百科
  8. 并购后仍不吭声的当当,下一步剑指何方?
  9. SQL提高查询效率知识拾忆
  10. 【Plumed教程(一)】增强采样Plumed入门