一、限流与降级

客户端限流

  1. 按钮置灰
  2. js控制每秒只能发送一个请求

站点层限流

1. Nginx限流

Nginx官方版本限制IP的连接和并发分别有两个模块:

  • limit_req_zone: 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法。
  • limit_req_conn: 用来限制同一时间连接数,即并发限制。
2. 站点层限流

客户端限流一般可以限制住普通用户,对于高端用户,则可能使用脚本刷,或者实际抢购的用户量确实大,故需要在站点层进行限流,如单个部署实例的每秒最大请求数,每个用户每秒的最大请求或者通过Redis记录和限制单个用户只能请求一次。

写流量
  • 根据uuid限制每个用户每秒只能一个请求,如使用guava的RateLimiter在进程限流,故如果多个节点,则每个用户可请求数量实际是节点个数倍;或者通过Nginx将相同的uuid转发到相同的机器上面。
读流量:
  • 页面缓存和页面数据缓存。页面缓存可以是进程缓存,页面数据缓存一般是分布式缓存,保持各节点的数据一致性,如库存数量可以放到分布式缓存中。

降级

  • 如果流量太大,导致站点层限流后还是出现问题挂了或者站点层没问题,队列出问题了,则需要采取降级策略。
  • 对于站点层出问题,则可以在客户端直接提示“服务器繁忙,稍后再试”。
  • 对于队列挂了或者Redis挂了无法读取到库存信息,则可以在站点层降级处理,直接返回和提示“抢购人数太多,请稍后尝试”。

二、队列削峰

通过第一步限流后,将合法流量放到一个队列中,实现流量削峰,达到流量可控和异步处理。

入队条件

  • 秒杀的数量有限,所以不需要将第一步限流中成功通过的所有请求都放到队列中,而是可以先将库存数量放到分布式缓存中,如Redis,然后先检查库存是否还有,即数量大于0:

    1. 有则扣减库存,则将该请求放到队列中,注意这里存在读数量get,递减数量两个过程,故分布式里面存在并发问题,即两个机器同时读都是100,都递减1,写回99,则其实是减了2,所以这里的数字不是精确的,即放到队列的数据是大于100的,不过具体下单扣减是在后台服务消费队列时使用,故该并发问题对秒杀来说问题不大。如果需要保证一致,则可以使用Redis实现一个分布式锁,即setnx的使用,不过秒杀系统不需要,否则并发量会急剧下降。
    2. 否则库存不足,直接返回抢购完毕,或者可以优化一下说“抢购完毕,如果有小伙伴放弃,可以继续抢购”来避免队列消息处理失败导致还有没卖完。

请求响应

  • 入队成功或者失败都可以将该请求直接返回了,不过页面可以显示等待中或者提示抢购结果稍后通知,如现在很多抢票都是这样的。

三、服务层异步处理

  • 服务层消费队列的数据,由于此时速度是可控的,故可以起一个后台服务节点即可,这个后台服务可以使用一个线程来执行这个操作就可以了,这样就不存在竞争问题。如果需要多个后台服务或者多个线程,则可以依赖数据库的自身的锁即可,如乐观锁,来解决并发问题。所以由该后台服务消费队列的数据,进行下单操作,递减数据库库存。
  • 如果消费队列的某个数据失败,可以采用fail-fast的原则,直接提示失败,不需要进行重试之类的复杂操作。

四、抢购结果通知

由于使用了队列来异步处理,即入队后或者库存不足无法入队,该次抢购请求是直接返回了的,故对于抢购结果是需要进行额外通知的。

1. 客户端轮询

可以通过客户端定时请求服务端,如每秒发送一个请求,如果成功,则提示抢购成功;失败,则返回失败。例如,客户端可以在没有轮询到处理结果时提示“抢购中,请耐心等待”,如果轮询到结果则提示成功或失败。

2. 消息推送

另外一种方式可以是直接通过消息推送的方式来通知用户抢购结果。

五、完整架构示意图


其中站点层也就是web网关层,提供web API接口,如上图的站点1、2、3是一个 Web 网关集群的多个部署节点,通过 Nginx 来进行负载均衡实现请求的分发。

六、项目实战

以上介绍了秒杀系统设计的基本思路,具体的实现代码可以参加本人的Github:电商网站与秒杀系统:eshop

秒杀系统设计思路与实战(含源码实现)相关推荐

  1. JavaWeb企业财务|记账|账单管理系统设计与实现(含源码+论文+答辩PPT等)

    该项目采用技术JSP.Servlet.jdbc.Tomcat服务器.MySQL数据库 ,项目含有源码.论文.配套开发软件.软件安装教程.项目发布教程 企业财务管理系统主要用于实现公司的财务管理,基本功 ...

  2. 前后端分离架构一直没机会实战?1周完成Vue+Core WebApi移动商城实战(含源码)!...

    疫情让企业受到重创! 就业形势更加严峻! 前后端分离架构成了当下最高频的招聘需求 还没实战过前后端分离? 花3分钟阅读本文, 带你全面了解前后端分离,轻松面试拿高薪! Web发展至今技术非常成熟,主流 ...

  3. 萤石云枪机球机云台接入控制实战-含源码-layui

    标题最终效果图,下班后摄像头关闭了 主要使用到的技术栈:layui,阿里图标库,layui内置jquery ,mui.min.js,ezuikit.js,萤石云 开始用vedio.js来做,可以播放m ...

  4. 【python自动化测试】京东|淘宝|秒杀12306抢票程序揭秘!一起薅羊毛吧【含源码】

    相信老铁们应该也看过很多这样的视频或者帖子:python自动秒杀的程序,京东,淘宝,大麦网抢票,秒杀抢购抢茅台,12306抢票,还有python薅羊毛的,感觉好像需求挺大的,很多人感兴趣.我也看了一些 ...

  5. PHP单页面加密视频教程附源码,thinkphp3.2最新版本项目实战视频教程(含源码)

    php教程 当前位置:主页 > php教程 > thinkphp3.2最新版本项目实战视频教程(含源码) thinkphp3.2最新版本项目实战视频教程(含源码) 教程大小:2.1GB   ...

  6. 【Chrome浏览器插件开发】浏览器插件运行机制03之实战使用Vue.js 3 + Vite 2开发出简易的浏览器插件(含源码)

    文章目录 知识点: 一.使用 vite 创建项目 1.1 环境搭建 1.2 安装vite工具 1.3 创建vite项目 1.4 进入项目并安装依赖 1.5 修改端口 1.6 运行项目 二.创建项目资源 ...

  7. Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析

    Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...

  8. Eatting外卖基于瑞吉外卖代码全功能优化含源码

    Eatting外卖基于瑞吉外卖代码全功能优化含源码 文章目录 项目的最终部署 源码地址 github:[源码地址](https://github.com/yangxingyue0623/Eating_ ...

  9. SwiftUI 音乐和网络大全之网络音乐播放App支持iTunes搜索与播放(教程含源码)

    实战需求 SwiftUI 音乐和网络大全之网络音乐播放App支持iTunes搜索与播放(教程含源码) 本文价值与收获 看完本文后,您将能够作出下面的界面 实战代码 import SwiftUIstru ...

最新文章

  1. 面试官:你知道双机存储有哪几种吗?分别有哪些优缺点(主备、主从、主主)...
  2. opencv中的Rodrigues()函数
  3. 计算机组成与体系结构-----数制
  4. 一个关于php使用pdo方式进行数据库连接和处理的类
  5. 带表头节点单链表及其基本应用
  6. 高效终端设备视觉系统开发与优化
  7. [转] C#异步操作
  8. 【DP】字串距离(luogu 1279)
  9. CentOS7.0安装Nginx 1.7.4
  10. ECMAScript 6 之 let 和 const 命令
  11. 我的内核学习笔记7:Intel LPC驱动lpc_ich分析
  12. linux脚本输出缓存上限,关于 Linux 下后台执行 Python 脚本的缓冲问题
  13. python入门指南by许半仙-推文:拯救书荒(短篇小甜饼合集)
  14. 【01】如何在XMind中排列自由主题
  15. JavaWeb文件上传(2)--使用fileupload组件
  16. Kafka AKHQ 安装部署
  17. 邱锡鹏DL经典-神经网络与深度学习
  18. 阿里云短信接口方法使用
  19. 基于Azure Percept 避障乐高汽车
  20. Oozie-4.1.0-cdh5.5.2 安装部署使用

热门文章

  1. Java基础-1 基础数据类型及常用引用数据类型
  2. matlab fromstream,Matlab中的RandStream的应用场景 -转
  3. 一堂难忘的计算机课作文,一堂难忘的课小学生作文4篇
  4. 【转】微信与朋友圈后台架构
  5. 水准网平差程序Matlab实现 全部代码,详细教程
  6. 怎么保证SD卡中的数据与物理SD卡绑定 防止SD卡中数据被复制到电脑上
  7. 用户画像系列——认识每一个“你”:微博中的用户模型
  8. stm32f401 边沿捕获_基于ST STM32F401 BLE紫外线监测方案
  9. Coursera SQL for Data Science - Notes
  10. MAX232后缀的含义