在web应用中,同一时间有大量的客户端请求同时发送到服务器,例如抢购、秒杀等。这个时候如何避免将大量的请求同时发送到业务系统。

第一种方法:在容器中配置最大请求数,如果大于改请求数,则客户端阻塞。该方法有效的阻止了大量的请求同时访问业务系统,但对用户不友好。

第二种方法:使用过滤器,保证一定数量的请求能够正常访问系统,多余的请求先跳转到排队页面,由排队页面定时发起请求。过滤器实现如下:

public class ServiceFilter implements Filter {

private static final int MAX_COUNT = 20;

private AtomicInteger filterCount = 0;

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

System.out.println("before"+filterCount);

if(filterCount > MAX_COUNT) {

//请求个数太多,跳转到排队页面

request.getRequestDispatcher("index.jsp").forward(request, response);

} else {

//请求个数加1

filterCount.incrementAndGet();

chain.doFilter(request, response);

//访问结束,请求个数减1

filterCount.decrementAndGet();

}

}

此种方式的实现就是限流。可以参考RateLimiter的令牌桶限流策略的实现。

public class RateLimiterUtils {

private static Logger logger = LoggerFactory.getLogger(RateLimiterUtils.class);

private static final ConcurrentHashMap resourceLimitMap =

new ConcurrentHashMap();

/**

* 限流

* @param resource 需要限流的对象的标识

* @return true表示得到了许可,没有达到限流阀值,false表示得不到许可,达到了限流阀值。

* @author: hejinen

* @date:2016年10月19日 上午11:08:49

*/

public static boolean rateLimit(String resource) {

RateLimiter limit = getRateLimit(resource);

return limit.tryAcquire();

}

/**

* 获取某个需限流对象的RateLimiter,如不存在则创建新的

* @param resouce 需要限流的对象标识

*/

public static RateLimiter getRateLimit(String resource) {

RateLimiter limit = resourceLimitMap.get(resource);

if(limit == null) {

synchronized(RateLimiterUtils.class) {

limit = resourceLimitMap.get(resource);

double qps = getQpsByResource(resource);

if(limit == null) {

limit = RateLimiter.create(qps);

resourceLimitMap.put(resource, limit);

LoggerUtil.info(RateLimiterUtils.class, "create rate limiter for key:{0},QPS:{1}", resource,qps);

}

}

}

return resourceLimitMap.get(resource);

}

}

总结

以上就是本文关于Javaweb应用使用限流处理大量的并发请求详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:javaweb设计中filter粗粒度权限控制代码示例、Javaweb项目session超时解决方案、Javaweb使用cors完成跨域ajax数据交互等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

java web流量阀值_Javaweb应用使用限流处理大量的并发请求详解相关推荐

  1. 算法高级(7)-限流(Rate limit)算法详解

    一.前言 保障服务稳定的三大利器:熔断降级.服务限流和故障模拟.今天和大家谈谈限流算法的几种实现方式,本文所说的限流并非是Nginx层面的限流,而是业务代码中的逻辑限流. 那么为什么需要限流呢? 按照 ...

  2. 流量治理神器-Sentinel的限流模式,选单机还是集群?

    大家好,架构摆渡人.这是我的第5篇原创文章,还请多多支持. 上篇文章给大家推荐了一些限流的框架,如果说硬要我推荐一款,我会推荐Sentinel,Sentinel的限流模式分为两种,分别是单机模式和集群 ...

  3. 限流是解决高并发大流量的一种方案,至少是可以保证应用的可用性

    # 限流算法 推荐微信公众号:[矿洞程序员]文章由高端社区fameLink联合创始人陶德与我及其他社区大佬联合发表.关注[矿洞程序员]可获得大咖陶德的私人微信. 限流是解决高并发大流量的一种方案,至少 ...

  4. 红包系统流量高并发技术详解

    发红包是目前各大互联网公司最常用的营销手段之一,它形式多样,内容丰富.2016 年底苏宁金融开启了红包系统及相关系统的项目开发. 本文将对苏宁金融红包系统的架构部署方式.演变过程.技术优化等方面进行详 ...

  5. (转)web.xml 中的listener、 filter、servlet 加载顺序及其详解

    转: https://www.cnblogs.com/Jeely/p/10762152.html web.xml 中的listener. filter.servlet 加载顺序及其详解 一.概述 1. ...

  6. JAVA 多线程并发超详解

    JAVA 多线程并发超详解(未完,下一篇文章还有) 1. JAVA 多线程并发 1.1.1. JAVA 并发知识库 1.1.2. JAVA 线程实现/创建方式 1.1.2.1. 继承 Thread 类 ...

  7. 5W字高质量java并发系列详解教程(上)-附PDF下载

    文章目录 第一章 java.util.concurrent简介 主要的组件 Executor ExecutorService ScheduledExecutorService Future Count ...

  8. Java高并发编程详解系列-Java线程入门

    根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面.   首先介绍一下这个系列的东西是什么,这个系列自己 ...

  9. Java基础之匿名内部类,匿名内部类是什么?为什么要用匿名内部类,匿名内部类详解。

    Java基础之匿名内部类,匿名内部类是什么?为什么要用匿名内部类,匿名内部类详解. 什么是匿名内部类? 顾名思义 匿名 就是没有名字,一个没有名字的内部类,称为匿名内部类. 下面先看一个例子,比如说你 ...

最新文章

  1. 【转】做正确的事情,等着被开除(Do the right thing, Wait to get fired)
  2. 皮一皮:千万别得罪一个文科生...
  3. python适合做后端开发吗-pythonWeb后端开发好呢?还是从事网络爬虫比较好呢?
  4. WebService 用户名密码验证
  5. ITTC数据挖掘平台介绍(综述)——平台简介
  6. OpenMetric与时序数据库模型之主流TSDB分析
  7. pwm一个时间单位_PTO PWM要点
  8. 100%在CSS中是什么意思?
  9. 软件设计是怎样炼成的(6)——打造系统的底蕴(数据库设计)(下篇)
  10. 统计系统中所有进程占用内存的方法
  11. BAT算法工程师的成长之路,超详细的学习路线
  12. 2022苹果CMS全新二开影视源码App源码完整版
  13. 电工专业技能计算机操作,电工操作技能考核的方案.doc
  14. 软件测试时印象深刻的bug案例,请问你遇到过哪些印象深刻的bug,接口测试出现bug的原因有哪些?...
  15. Spark GraphX 图算法的理解
  16. 屏蔽 app 开屏广告,舒畅了
  17. MySQL查询日期为一年第几天第几周,天数周数反查日期
  18. 吴恩达ML WEEK7 机器学习
  19. in 在将 nvarchar 值转换成数据类型 int 时失败
  20. Java NIO与Java BIO的区别是什么?

热门文章

  1. 802.11无线信道详解
  2. Linux系统启动流程图
  3. C++ 作用域与生命周期
  4. 5个让你的404页面变的更加实用的技巧
  5. 获取响应里面的cookie的方法
  6. Ubuntu tee
  7. node.weiChat
  8. 深入了解preventDefault与stopPropagation
  9. 事件处理介绍(简要学习笔记十七)
  10. 解决oracle11g连接失败 ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist