前言

  首先,要明确一点,高并发场景下系统的瓶颈出现在哪里,其实主要就是数据库,那么就要想办法为数据库做层层防护,减轻数据库的压力。

一、简单图示

我用一个比较简单直观的图来表达大概的处理思路

二、生产环境中秒杀抢购的解决方案

1、前端

  1)、动静分离,将静态资源放到第三方云服务中进行CDN加速,减轻秒杀时的带宽压力,比如阿里云、七牛云等等。实践证明,CDN加速的效果十分明显,对于一些响应不是很快的网站而言,静态资源做了CDN加速后会变得很快,前后响应速度截然不同,是生产中必不可少的一种方式。
  2)、点击秒杀按钮后,记得将按钮禁用。

主要是为了防止重复点击提交

  3)、使用验证码恶意防刷

类似于斗鱼等直播平台抢礼物的场景,你几乎每次在最后一秒点击的时候都会弹出比较复杂的图形验证码,感官上好像是耽误了你一两秒的时间,实际上这种简单的方式不仅分散了流量,而且防止有恶意刷秒杀接口的行为,十分好用。

  4)、秒杀详情页的页面端,使用定时器查询秒杀结果。

这是秒杀场景下必不可少的一件事,判断是否秒杀到就是在前端通过一个定时器不断轮询服务端接口,查询秒杀结果最终返回是成功或失败。

  5)、商品的详情页可以使用页面静态化技术提高响应速度

有两种方式,一种是使用nginx对页面进行缓存配置,一种是直接利用浏览器端缓存,两种差不多,相比之下后一种其实更科学。

2、网关

  网关一般在微服务中用来做认证鉴权以及限流操作,这里在秒杀场景中就是使用限流算法,对用户秒杀请求实现限流和服务保护。
  限流算法有很多,比如redis限流、nginx、hystrix等等,实际工作中使用最多的还是令牌桶算法,可以基于这个算法自己写一个注解,也可以使用Google工具类已经实现的RateLimter,两三行就能实现效果。

3、服务端

  服务端主要就是对秒杀接口的优化

  1)、服务端模板技术进行页面静态化,一般针对详情页,使用freemarker、thymeleaf、velocity等模板技术,适用于访问量较大的页面,页面又不会频繁改变的场景。一般要设置缓存过期时间,给它一个较短的缓存期,比如60秒;
  2)、服务端对象缓存,一般针对商品列表,使用redis,有分页的缓存个1-3页就OK了,一般用户也就点个几页就不点了;
  3)、秒杀接口的熔断降级,主要是对接口进行保护;
  4)、token令牌方式处理秒杀请求,结合redis,将和库存数量一致的token令牌放入redis(这个放令牌的操作是在后台完成的),每一个令牌都承接一个秒杀请求,请求获取到令牌就返回秒杀成功,没获取到就返回秒杀失败,这样就防止大量请求来访问接口并且对数据库进行操作,很大程度上提高了性能和接口响应速度;
  5)、对于秒杀成功的请求,需要修改库存,那么就要对数据库进行操作,可以结合MQ异步修改库存,降低高并发场景下对数据库带来的压力;
  6)、编写一个返回秒杀结果的接口,对应前面写的前端定时器轮询查询秒杀结果这部分。

4、服务器优化

  进行服务器集群即可,比如nginx+lvs,分担服务器承载请求的压力,同时也是分散流量最传统的一种方式。

5、超卖问题

  主要两种方式:
  1)、一种是使用数据库自带的行锁机制,这种方式我在工作中用过,完全可以解决超卖问题,对于流量不大的秒杀场景实际上完全够用,性能消耗也不明显;
  2)、另一种是现在比较流行的version版本号实现的乐观锁机制,就是在数据库中加一个version字段来表示版本号,修改库存时先获取当前版本号,然后修改时就传入该版本号并且对当前版本号+1,这种相较于第一种就更科学,在性能上更优越,而且对于流量较大的秒杀场景而言容错率更高,这个后面会讲。

6、压测工具的使用

  可以使用Apache的jmeter压测工具,操作简单,在测试秒杀接口时可根据测试结果不断优化,还能生成测试结果的报表。

总结

  以上是对java秒杀整体思路的概括,每一个阶段其实都代表一项单独的技术,需要专门去学习和研究。

java秒杀方案总体思路相关推荐

  1. 【Java秒杀方案】实现思路

    前言  首先,要明确一点,高并发场景下系统的瓶颈出现在哪里,其实主要就是数据库,那么就要想办法为数据库做层层防护,减轻数据库的压力. 一.简单图示  我用一个比较简单直观的图来表达大概的处理思路 二. ...

  2. 【Java秒杀方案】11.功能开发-【商品秒杀及优化】防止超卖 接口优化(redis预减库存,内存标记减少redis访问,RabbitMQ异步下单) 安全优化(隐藏秒杀接口,验证码,接口防刷)

    商品秒杀核心功能及优化 1. 正常秒杀流程 在商品详情页面等待秒杀倒计时–http://localhost:8080/goodsDetail.htm?goodsId=2 倒计时为0,开始秒杀,点[秒杀 ...

  3. Java秒杀系统方案优化 高性能高并发实战 学习笔记

    秒杀系统 (一)搭建环境 自定义封装Result类 自定义封装CodeMsg类 集成redis和rabbit 封装RedisService类 断言和日志测试 (二)实现用户登录和分布式Session ...

  4. java电商秒杀深度优化_【B0796】Java性能优化亿级流量秒杀方案及电商项目秒杀实操2020视频教程...

    Java视频教程名称:Java性能优化亿级流量秒杀方案及电商项目秒杀实操2020视频教程    java自学网[javazx.com]  性能视频教程   it教程 Java自学网收集整理 java论 ...

  5. Java秒杀系统优化的工程要点

    这篇博客是笔者学习慕课网若鱼老师的<Java秒杀系统方案优化 高性能高并发实战>课程的学习笔记.若鱼老师授课循循善诱,讲解由浅入深,欢迎大家支持. 本文记录课程中的注意点,方便以后code ...

  6. Java秒杀系统优化(高性能高并发)

    源码免费下载地址:关注微信公众号"虾米聊吧",回复关键字"秒杀" 主题:在大并发,大流量的情况下如何提升吞吐量或者说QPS? 而秒杀活动恰恰就是属于大并发的情形 ...

  7. Java秒杀系统实战系列~构建SpringBoot多模块项目

    摘要:本篇博文是"Java秒杀系统实战系列文章"的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项 ...

  8. 文档在线预览:总体思路

    文档在线预览研究系列 总体思路 文档生成技术细节 利用百度阅读器 近两年出现了许多以"经验交易"为核心的文档平台,如豆丁网.百度文库.星期八等网站.这些网站将文档(知识)存放在网站 ...

  9. 汽车ABS控制器设计及车身稳定算法研究笔记(一)——总体思路

    2019.10.9 ❤ 好久没写了,本来想想总结下做dsp舵机控制器的经验,但是老师催得紧,一直没时间(其实主要是懒...).这说话就中期了,我的课题还没开始,没办法,重要不紧急总有变成重要紧急的时候 ...

最新文章

  1. 史上最全的CSS hack方式一览(转)
  2. 专访DeepID发明者孙祎:关于深度学习与人脸算法的深层思考
  3. k8s minikube启动时指定镜像源的启动方式
  4. AI 质检学习报告——实践篇——第二步:实现图片识字
  5. HTML Viewer的定制
  6. linux正则 转义字符,正则表达式(5):转义符
  7. java 传址或传值
  8. 电路计算机辅助设计上海电力学院,上海电力学院电路计算机辅助设计1.doc
  9. 使用mybatis的resultMap进行复杂查询
  10. 统一Retrofit失败的处理情况
  11. 玩转基金(3)买卖基金
  12. ubuntu 用apt安装预编译的preempt 实时操作系统内核
  13. 排列组合算法的javascript实现
  14. 项目中涉及到金钱的计算时,数据库字段的使用
  15. STM32F4开发板硬件平台简介
  16. 物联网之STM32开发一(基础知识)
  17. 计算机技术助力高考填报志愿,填报高考志愿需要综合考虑八大因素,助力考生志愿填报,梦想成真...
  18. 华数机器人编程语言_「高工机器人|头条」控制器产品技术大比拼 这七家企业有什么不同...
  19. android电池管理系统
  20. System Analysis and Project Management

热门文章

  1. html代码复制繁体,JavaScript_简体中文转换繁体中文(实现代码),复制代码 代码如下:var Default_is - phpStudy...
  2. 计算机无法启动硬盘损坏,如果无法打开计算机硬盘分区该怎么办? chkdsk方法修复损坏的磁盘...
  3. ps -aux | grep xxx, kill -s 9, pgrep --Linux下进程
  4. 基于JavaWeb的企业合同管理系统(源码+论文)
  5. linux爱数备份客户端安装:要备份oracle数据库
  6. SEO网站优化第一步:关键词词库表格的建立和关键词分组
  7. 诺贝尔奖得主背后有哪些故事?美纳里尼基金会推出“超越国界对话”系列片...
  8. 一些Perl例程(全部手打并执行过)
  9. vue cli 3中使用bootstra组件
  10. 6572 官方 支持 Android,MTK6572 android4.4上串口模块的调试