java web流量阀值_Javaweb应用使用限流处理大量的并发请求详解
在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应用使用限流处理大量的并发请求详解相关推荐
- 算法高级(7)-限流(Rate limit)算法详解
一.前言 保障服务稳定的三大利器:熔断降级.服务限流和故障模拟.今天和大家谈谈限流算法的几种实现方式,本文所说的限流并非是Nginx层面的限流,而是业务代码中的逻辑限流. 那么为什么需要限流呢? 按照 ...
- 流量治理神器-Sentinel的限流模式,选单机还是集群?
大家好,架构摆渡人.这是我的第5篇原创文章,还请多多支持. 上篇文章给大家推荐了一些限流的框架,如果说硬要我推荐一款,我会推荐Sentinel,Sentinel的限流模式分为两种,分别是单机模式和集群 ...
- 限流是解决高并发大流量的一种方案,至少是可以保证应用的可用性
# 限流算法 推荐微信公众号:[矿洞程序员]文章由高端社区fameLink联合创始人陶德与我及其他社区大佬联合发表.关注[矿洞程序员]可获得大咖陶德的私人微信. 限流是解决高并发大流量的一种方案,至少 ...
- 红包系统流量高并发技术详解
发红包是目前各大互联网公司最常用的营销手段之一,它形式多样,内容丰富.2016 年底苏宁金融开启了红包系统及相关系统的项目开发. 本文将对苏宁金融红包系统的架构部署方式.演变过程.技术优化等方面进行详 ...
- (转)web.xml 中的listener、 filter、servlet 加载顺序及其详解
转: https://www.cnblogs.com/Jeely/p/10762152.html web.xml 中的listener. filter.servlet 加载顺序及其详解 一.概述 1. ...
- JAVA 多线程并发超详解
JAVA 多线程并发超详解(未完,下一篇文章还有) 1. JAVA 多线程并发 1.1.1. JAVA 并发知识库 1.1.2. JAVA 线程实现/创建方式 1.1.2.1. 继承 Thread 类 ...
- 5W字高质量java并发系列详解教程(上)-附PDF下载
文章目录 第一章 java.util.concurrent简介 主要的组件 Executor ExecutorService ScheduledExecutorService Future Count ...
- Java高并发编程详解系列-Java线程入门
根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面. 首先介绍一下这个系列的东西是什么,这个系列自己 ...
- Java基础之匿名内部类,匿名内部类是什么?为什么要用匿名内部类,匿名内部类详解。
Java基础之匿名内部类,匿名内部类是什么?为什么要用匿名内部类,匿名内部类详解. 什么是匿名内部类? 顾名思义 匿名 就是没有名字,一个没有名字的内部类,称为匿名内部类. 下面先看一个例子,比如说你 ...
最新文章
- 【转】做正确的事情,等着被开除(Do the right thing, Wait to get fired)
- 皮一皮:千万别得罪一个文科生...
- python适合做后端开发吗-pythonWeb后端开发好呢?还是从事网络爬虫比较好呢?
- WebService 用户名密码验证
- ITTC数据挖掘平台介绍(综述)——平台简介
- OpenMetric与时序数据库模型之主流TSDB分析
- pwm一个时间单位_PTO PWM要点
- 100%在CSS中是什么意思?
- 软件设计是怎样炼成的(6)——打造系统的底蕴(数据库设计)(下篇)
- 统计系统中所有进程占用内存的方法
- BAT算法工程师的成长之路,超详细的学习路线
- 2022苹果CMS全新二开影视源码App源码完整版
- 电工专业技能计算机操作,电工操作技能考核的方案.doc
- 软件测试时印象深刻的bug案例,请问你遇到过哪些印象深刻的bug,接口测试出现bug的原因有哪些?...
- Spark GraphX 图算法的理解
- 屏蔽 app 开屏广告,舒畅了
- MySQL查询日期为一年第几天第几周,天数周数反查日期
- 吴恩达ML WEEK7 机器学习
- in 在将 nvarchar 值转换成数据类型 int 时失败
- Java NIO与Java BIO的区别是什么?