高并发是互联网应用的一大特色,也是互联网应用不可避免的问题;比如淘宝双11、京东618、12306春节火车票,促销、秒杀等等。

一、什么是高并发

高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。

响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。

吞吐量:单位时间内处理的请求数量。

QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。

并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。

二、什么是秒杀

秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商品的特殊性,会吸引大量用户前来抢购,并且会在约定的时间点同时在秒杀页面进行抢购。

此种场景就是非常有特点的高并发场景,如果不对流量进行合理管控,肆意放任大流量冲击系统,那么将导致一系列的问题出现,比如一些可用的连接资源被耗尽、分布式缓存的容量被撑爆、数据库吞吐量降低,最终必然会导致系统产生雪崩效应。

一般来说,大型互联网站通常采用的做法是通过扩容、动静分离、缓存、服务降级及限流五种常规手段来保护系统的稳定运行。

三、如何解决秒杀的高并发

1. 限流

在讨论为什么需要限流之前,我们先聊一聊生活中那些随处可见的限流场景。

例如上下班高峰期,大量人群涌入地铁站,会造成严重拥堵,原本从站厅到站台最多只需花费5分钟左右的时间,却在被限流管制下被迫花费30分钟或更久才能顺利进入站台。

上面两张图片就展示了地铁拥挤的场景,如果这所有的人全部涌入站台,那么会造成更多的人无法上车,所以采取了管制之后,我们可以让人们通过地面和站厅层的双重排队等待,减轻站台的压力,保证每一位乘客最终都能顺利的上车。

在电商系统的秒杀中,也会有大批量的用户同时涌入,鉴于只有少部分用户能够秒杀成功,所以要限制大部分流量,只允许少部分流量进入服务后端。

限流可以采用限制服务器的连接等待数量以及等待时间,每次只放行少量用户,让更多的用户处于假排队的状态。

例如tomcat的配置:

其中最后两个参数意义如下:

maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200

acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100

这两个值如何起作用,请看下面三种情况

情况1:接受一个请求,此时tomcat起动的线程数没有到达maxThreads,tomcat会起动一个线程来处理此请求。

情况2:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,tomcat会把此请求放入等待队列,等待空闲线程。

情况3:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,等待队列中的请求个数也达到了acceptCount,此时tomcat会直接拒绝此次请求,返回connection refused。

2. 页面静态化

首先我们可以使用Freemarker对页面进行静态化,让用户减少跟后端服务器之间的交互。这样就能降低服务器的压力,如果条件允许我们可以采用CDN加速。

Freemarker的原理如下图,模板+数据通过Freemarker可以生成静态页面。

CDN是将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。

例如下图:北京网民会自动访问到离自己最近并且速度最快的服务器的资源。

3. 引入Redis

限流和静态化都是为了减轻服务器后端的压力,但是最终用户的请求还是会落到服务器中,为了增加用户的体验度,我们也应加快相应速度。后端代码和数据库之间的交互会降低相应速度,所以我们可以采用Redis来进行数据的高速读取。

Redis是一款极其优秀的内存级别的NoSql数据库,单线程下读写速度能达到5w/s。所以我们在很多情况下都能利用Redis去解决高速读取的问题。

特别是库存量的超卖现象,我们可以在开始秒杀的时候,把总的库存量存入Redis中,每当用户来抢购时,利用String类型的decr方法去减一,如果减一成功就视认为抢够成功,并把用户和商品信息存入Redis的订单条目中,当最终抢购结束时,我们再一并把Redis的订单信息存入到数据库中。

代码参考:

四、Java高并发解决方案总结

通过上述3种方案可以解决大部分场景下的秒杀问题,当然高并发下也会出现更多的意外的状况,那么我们可以针对自己的业务,资源的调度进行更多方位的尝试,找到最适合自己的解决方案。

Java高并发:

全面深入学习Java并发编程

Java基础入门:

java零基础自学首Java入门教程(含Java项目和Java真题)

Javaweb核心基础

JavaWeb基础教程,Java web从入门到企业实战完整版

Java处理高并发详细方案相关推荐

  1. Java架构-高并发的解决实战总结方案

    Java架构-高并发的解决实战总结方案 1.应用和静态资源分离 刚开始的时候应用和静态资源是保存在一起的,当并发量达到一定程度的时候就需要将静态资源保存到专门的服务器中,静态资源主要包括图片.视频.j ...

  2. 【在线网课】Java高性能高并发秒杀系统方案优化实战

    java教程视频讲座简介: Java高性能高并发秒杀系统方案优化实战 Java秒杀系统方案优化 高性能高并发实战 以"秒杀"这一Java高性能高并发的试金石场景为例,带你通过一系列 ...

  3. 大厂10年经验,我对Java高并发问题方案的总结,堪称教科书级

    作为一个 Java 开发人员,多线程是一个逃不掉的话题,不管是工作还是面试,但理解起来比较模糊难懂,因为多线程程序在跑起来的时候比较难于观察和跟踪.搞懂多线程并发知识,可以在面试的时候和周围人拉开差距 ...

  4. java处理高并发高负载类网站的优化方法

    java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF ...

  5. java处理高并发高负载类网站问题

    java处理高并发高负载类网站问题 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF.尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MyS ...

  6. Java JUC高并发编程(三)-CallableJUC辅助类

    目录 一.Callable接口 二.JUC辅助类 1.减少计数CountDownLatch 2.循环栅栏CyclicBarrier 3.信号灯Semaphore 一.Callable接口 Callab ...

  7. Java JUC高并发编程(一)

    目录 一.概述 二.Lock接口 三.线程间的通信 解决虚假唤醒问题 Lock通信示例: 四.线程间定制化通信 一.概述 JUC就是java.util.concurrent工具包的简称,这是一个处理线 ...

  8. JAVA中的高并发,解决高并发的方案

    java高并发,如何解决,什么方式解决 一.什么是高并发 二.高并发的解决方法有两种 三.追加 一.什么是高并发 1.1 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑 ...

  9. Java百万高并发的技术方案

    前言:高并发,几乎是每个程序员都想拥有的经验.原因很简单:随着流量变大,会遇到各种各样的技术问题,比如接口响应超时.CPU load升高.GC频繁.死锁.大数据量存储等等,这些问题能推动我们在技术深度 ...

最新文章

  1. java,使用get、post请求url地址
  2. java开心农场安卓_开心农场之田园日记
  3. 初识Python之安装—anaconda pycharm区别
  4. 虚拟研讨会:.NET的未来在哪里?
  5. 看libevent所遇到的英语生词
  6. opencv OCR 端到端场景文本检测与识别(webcam_demo) vs2015
  7. python数字转换成中文大写_Python将阿拉伯数字转化为中文大写
  8. 【项目实训】微信公众号获取用户openid
  9. 工厂模式(包含3种工厂)
  10. arm nodejs_nodejs是如何和libuv以及v8一起合作的?(文末有彩蛋哦)
  11. Win10 如何删除系统盘大文件hiberfil.sys
  12. Alien Skin Exposure X5 Bundle Mac(PS/LR照片胶片滤镜插件)
  13. 开源项目——小Q聊天机器人V1.5
  14. 最快的扫雷记录,初级只需要0.49秒,一眨眼就结束的操作!
  15. 如何购买云服务器----以华为云服务器为例
  16. EVE-NG Lab通过Cloud连接外网
  17. MySQL中的事务相关属性以及JDBC编程
  18. Modbus的基础学习
  19. ios系统可以使用python吗_怎么使用 Python 开发 iOS 程序
  20. windbg-!cs、~~[TID](经典死锁)

热门文章

  1. 室内P1.8超清LED无缝拼接LED显示屏详细介绍及显示效果和尺寸长高比例
  2. Window jar包启动脚本
  3. WPF 设置 圆角 例如Grid、Button、TextBox、PasswordBox
  4. 花30天整理了11个超棒的Java开源项目,雀氏牛逼
  5. 丽台p1000相当于什么级别的显卡
  6. 华为平板m6 鸿蒙,第一眼就爱上它:华为平板M6开箱体验
  7. Vue slot插槽
  8. Java GUI(图形用户界面)概述
  9. 物联卡查询流量_物联卡流量查询(QueryCardFlowInfo)---PHP
  10. 两个Vector交集、并集、补集运算