`
cfyme
  • 浏览: 273660 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

秒杀系统设计的知识点

 
阅读更多

秒杀系统涉及到的知识点:

 

A, 高并发,cache,锁机制 

 

B, 基于缓存架构redis,Memcached的先进先出队列。

 

C, 稍微大一点的秒杀,肯定是分布式的集群的,并发来自于多个节点的JVM,synchronized所有在JVM上加锁是不行了

 

D, 数据库压力

 

E, 秒杀超卖问题

 

F, 如何防止用户来刷, 黑名单?IP限制?

 

G, 利用memcached的带原子性特性的操作做并发控制. 

 

 

秒杀简单设计方案如:

比如有10件商品要秒杀,可以放到缓存中,读写时不要加锁。 当并发量大的时候,可能有25个人秒杀成功,这样后面的就可以直接抛秒杀结束的静态页面。进去的25个人中有15个人是不可能获得商品的。所以可以根据进入的先后顺序只能前10个人购买成功。后面15个人就抛商品已秒杀完。

 

 

 

 

 

假设我们的秒杀场景:

       比如某商品10件物品待秒. 假设有100台web服务器(假设web服务器是Nginx + Tomcat),n台app服务器,n个数据库 

 

 1. 第一步 如果Java层做过滤, 可以在每台web服务器的业务处理模块里做个计数器AtomicInteger(10)=待秒商品总数, 

 decreaseAndGet()>=0的继续做后续处理, <0的直接返回秒杀结束页面. 

 这样经过第一步的处理只剩下100台*10个=1000个请求. 

 

 2. 第二步, memcached 里以商品id作为key的value放个10, 每个web服务器在接到每个请求的同时, 向memcached服务器发起请求, 利用memcached的decr(key,1)操作返回值>=0的继续处理, 其余的返回秒杀失败页面. 

 这样经过第二步的处理只剩下100台中最快速到达的10个请求.

 

 3. 第三步, 向App服务器发起下单操作事务. 

 

 4. 第四步, App服务器向商品所在的数据库请求减库存操作, 

 (操作数据库时可以 "update table set count=count-1 where id=商品id and count>0;" update 成功记录数为1, 再向订单数据库添加订单记录, 都成功后提交整个事务, 否则的话提示秒杀失败. 用户进入支付流程. 

 

 

 

 

在看看淘宝的秒杀:

1、前端

面对高并发的抢购活动,前端常用的三板斧是【扩容】【静态化】【限流】

  A:扩容

  加机器,这是最简单的方法,通过增加前端池的整体承载量来抗峰值。

  B:静态化

  将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过CDN来抗峰值。

  C:限流

  一般都会采用IP级别的限流,即针对某一个IP,限制单位时间内发起请求数量。

  或者活动入口的时候增加游戏或者问题环节进行消峰操作。

  D:有损服务

  最后一招,在接近前端池承载能力的水位上限的时候,随机拒绝部分请求来保护活动整体的可用性。

2、后端

 

那么后端的数据库在高并发和超卖下会遇到什么问题呢

  I: 首先MySQL自身对于高并发的处理性能就会出现问题,一般来说,MySQL的处理性能会随着并发thread上升而上升,但是到了一定的并发度之后会出现明显的拐点,之后一路下降,最终甚至会比单thread的性能还要差。

  II: 其次,超卖的根结在于减库存操作是一个事务操作,需要先select,然后insert,最后update -1。最后这个-1操作是不能出现负数的,但是当多用户在有库存的情况下并发操作,出现负数这是无法避免的。

  III:最后,当减库存和高并发碰到一起的时候,由于操作的库存数目在同一行,就会出现争抢InnoDB行锁的问题,导致出现互相等待甚至死锁,从而大大降低MySQL的处理性能,最终导致前端页面出现超时异常。

 

针对上述问题,如何解决呢? 淘宝的高大上解决方案:

  I:  关闭死锁检测,提高并发处理性能。

  II:修改源代码,将排队提到进入引擎层前,降低引擎层面的并发度。

  III:组提交,降低server和引擎的交互次数,降低IO消耗。

 

解决方案1:

将存库从MySQL前移到Redis中,所有的写操作放到内存中,由于Redis中不存在锁故不会出现互相等待,并且由于Redis的写性能和读性能都远高于MySQL,这就解决了高并发下的性能问题。然后通过队列等异步手段,将变化的数据异步写入到DB中。

优点:解决性能问题

缺点:没有解决超卖问题,同时由于异步写入DB,存在某一时刻DB和Redis中数据不一致的风险。

 

解决方案2:

引入队列,然后将所有写DB操作在单队列中排队,完全串行处理。当达到库存阀值的时候就不在消费队列,并关闭购买功能。这就解决了超卖问题。

优点:解决超卖问题,略微提升性能。

缺点:性能受限于队列处理机处理性能和DB的写入性能中最短的那个,另外多商品同时抢购的时候需要准备多条队列。

 

解决方案3:

将写操作前移到MC中,同时利用MC的轻量级的锁机制CAS来实现减库存操作。

优点:读写在内存中,操作性能快,引入轻量级锁之后可以保证同一时刻只有一个写入成功,解决减库存问题。

缺点:没有实测,基于CAS的特性不知道高并发下是否会出现大量更新失败?不过加锁之后肯定对并发性能会有影响。

 

解决方案4:

将提交操作变成两段式,先申请后确认。然后利用Redis的原子自增操作,同时利用Redis的事务特性来发号,保证拿到小于等于库存阀值的号的人都可以成功提交订单。然后数据异步更新到DB中。

优点:解决超卖问题,库存读写都在内存中,故同时解决性能问题。

缺点:由于异步写入DB,可能存在数据不一致。另可能存在少买,也就是如果拿到号的人不真正下订单,可能库存减为0,但是订单数并没有达到库存阀值。

 

三、总结

1、前端三板斧【扩容】【限流】【静态化】

2、后端两条路【内存】+【排队】

 

 以上所有资料均来自互联网

 

分享到:
评论

相关推荐

    Java商城秒杀系统设计视频教程

    ### Java商城秒杀系统设计知识点概览 #### 一、Java高并发商城秒杀系统优化学习指引 **知识点概述:** 本章节主要介绍如何在Java环境下进行高并发商城秒杀系统的优化工作。针对高并发场景下的秒杀系统,将重点讨论...

    秒杀系统设计与实现.互联网工程师进阶与分析

    秒杀系统设计与实现是互联网行业中一个至关重要的领域,它涉及到高并发、高性能以及稳定性等核心挑战。在本文中,我们将深入探讨秒杀系统的设计原理、关键技术及其在实际项目中的应用,尤其关注Java语言下的解决方案...

    java秒杀系统设计与实现

    本篇文章将详细探讨Java在秒杀系统设计与实现中的关键知识点。 一、系统架构设计 1.1 分层架构 秒杀系统通常采用典型的三层架构:表示层(前端)、业务逻辑层(服务层)和数据访问层(数据库)。前端负责用户交互...

    秒杀系统架构设计-许大牛

    秒杀系统的架构设计主要包括以下几个核心知识点: 1. **高并发处理**:秒杀活动中,瞬间涌入的用户请求可能会超出系统正常处理能力,因此,架构设计必须具备应对高并发的能力。这通常包括负载均衡、分布式缓存、...

    秒杀系统架构设计.pdf

    ### 秒杀系统架构设计知识点概述 #### 一、热点数据与操作抽象 - **热点数据分类**: - **静态热点数据**:通常指在系统运行过程中不变或变化很小的数据,例如商品基本信息等。 - **动态热点数据**:在系统运行...

    Java毕业设计-基于微服务的商城秒杀系统源码.zip

    这是一个基于Java技术栈,采用微服务架构的商城秒杀系统毕业设计项目,源代码存放在名为"secondkill-master"的压缩包中。该系统旨在模拟真实电商环境下的高并发秒杀场景,通过微服务的方式解耦各个功能模块,提高...

    秒杀系统设计的所有代码

    以下是关于秒杀系统设计的关键知识点和代码实现概述: 1. **分布式锁**:秒杀活动中,同一商品不能被多个用户同时抢购。因此,需要使用分布式锁来确保并发控制,例如Redis的SetNX命令或Zookeeper的临时节点。 2. *...

    秒杀系统.zip

    秒杀系统设计的核心挑战之一是处理高并发请求。系统可能采用限流策略(如漏桶算法或令牌桶算法)、分布式锁(如Redis分布式锁)来控制并发量,防止瞬间流量过大导致服务器崩溃。此外,采用异步处理机制(如消息队列...

    任务书springboot193基于SpringBoot的秒杀系统设计与实现任务书.docx

    标题中的“基于SpringBoot的秒杀系统设计与实现”指的是使用SpringBoot框架来构建一个能够支持高并发秒杀活动的电子商务系统。SpringBoot是Java领域的一款流行轻量级框架,它简化了Spring应用的初始搭建以及开发过程...

    springboot193基于SpringBoot的秒杀系统设计与实现.rar

    标题“springboot193基于SpringBoot的秒杀系统设计与实现”暗示了这是一个关于使用SpringBoot框架构建的秒杀系统项目。秒杀系统在电商领域广泛应用,它允许商家在短时间内提供限量商品,吸引大量用户参与抢购,从而...

    大型电商秒杀系统源码

    下面将详细阐述这些知识点。 首先,`Spring` 是一个开源的应用框架,它提供了依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)的能力,使得开发者能够更方便地管理对象和...

    Java实现秒杀系统.zip

    秒杀系统是电商网站或应用中常见的功能,用于在短时间内处理大量用户请求,实现商品...以上是Java实现秒杀系统的主要技术要点,实际开发中还需要结合具体业务需求进行设计和优化,确保系统在高并发下的高效、稳定运行。

    Java毕业设计秒杀系统源码(源码+详细注释)

    【Java毕业设计秒杀系统源码】是一个典型的Java Web项目,用于模拟电商...以上是【Java毕业设计秒杀系统源码】中的核心知识点,通过学习和实践这个项目,可以深入理解Java Web开发的全过程,提升软件设计和开发能力。

    秒杀系统分析与实战

    ### 秒杀系统分析与实战知识点详述 #### 一、秒杀业务分析 **1. 正常电子商务流程** 正常的电子商务流程包含了六个主要步骤: - **查询商品**:用户在平台上查找感兴趣的商品。 - **创建订单**:选择商品后,...

    java秒杀系统

    秒杀系统设计的核心目标是处理高并发下的请求,避免超卖和资源浪费。通常包括以下几个关键步骤:前端展示、请求接收、库存检查、订单创建、支付接口调用。 3. **缓存技术**: 在秒杀系统中,缓存是提高性能的关键...

    秒杀系统实现

    此外,优化用户体验也是秒杀系统设计的一部分。比如,前端可以使用AJAX异步加载,提供实时反馈,减少用户等待时间;利用CDN(内容分发网络)加速静态资源的加载,降低网络延迟;并通过预加载、预占位等手段,提前...

    基于PHP Redis的商品秒杀系统的设计和实现.pdf

    以下是基于PHP Redis的商品秒杀系统的设计和实现的知识点: 1. 电子商务的发展:电子商务的发展使得秒杀活动成为电商行业重要的促销方式之一,可以吸引更多的消费者关注和购买。 2. 秒杀系统的挑战:秒杀活动面临...

    秒杀系统 投票系统 毕业设计.docx

    设计秒杀系统时,关键知识点包括: 1. 高并发处理:使用负载均衡技术分发流量,避免单点压力过大。例如,可以通过Nginx或HAProxy等工具进行负载均衡。 2. 数据库优化:使用读写分离、缓存技术(如Redis)减轻数据库...

    电商秒杀系统的设计与实现.zip

    在电商行业中,秒杀活动是一种常见的促销手段,它能在短时间内吸引大量用户参与,极大地提高商品销量和平台流量。...理解并掌握这些知识点,能够帮助我们构建出一个既能应对高并发,又能保证业务稳定性的高效秒杀系统。

    SpringBoot开发的高并发限时抢购秒杀系统(含数据库文件).zip

    【标题】:基于SpringBoot的高并发限时抢购秒杀系统设计与实现 【描述】:这个项目是一个使用SpringBoot框架构建的高并发限时抢购(秒杀)系统,它涵盖了从后端服务到数据库的设计与实现。系统的核心目标是处理大量...

Global site tag (gtag.js) - Google Analytics