打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Java使用限流处理大量的并发请求

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

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

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

  1. public class ServiceFilter implements Filter {  
  2.       
  3.     private static final int MAX_COUNT = 20;  
  4.       
  5.     private AtomicInteger filterCount = 0;  
  6.   
  7.     public void doFilter(ServletRequest request, ServletResponse response,  
  8.             FilterChain chain) throws IOException, ServletException {  
  9.         System.out.println("before"+filterCount);  
  10.         if(filterCount > MAX_COUNT) {  
  11.             //请求个数太多,跳转到排队页面  
  12.             request.getRequestDispatcher("index.jsp").forward(request, response);  
  13.         } else {  
  14.             //请求个数加1  
  15.             filterCount.incrementAndGet();  
  16.   
  17.             chain.doFilter(request, response);  
  18.             //访问结束,请求个数减1  
  19.             filterCount.decrementAndGet();  
  20.         }  
  21.     }  

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

  1. public class RateLimiterUtils {  
  2.       
  3.     private static Logger logger = LoggerFactory.getLogger(RateLimiterUtils.class);  
  4.       
  5.     private static final ConcurrentHashMap<String, RateLimiter> resourceLimitMap =   
  6.             new ConcurrentHashMap<String, RateLimiter>();  
  7.       
  8.       
  9.     /** 
  10.      * 限流 
  11.      * @param resource 需要限流的对象的标识 
  12.      * @return true表示得到了许可,没有达到限流阀值,false表示得不到许可,达到了限流阀值。 
  13.      * @author: hejinen 
  14.      * @date:2016年10月19日 上午11:08:49 
  15.      */  
  16.     public static boolean rateLimit(String resource) {  
  17.         RateLimiter limit = getRateLimit(resource);  
  18.         return limit.tryAcquire();  
  19.     }  
  20.         /** 
  21.      * 获取某个需限流对象的RateLimiter,如不存在则创建新的 
  22.      * @param resouce 需要限流的对象标识 
  23.      */  
  24.     public static RateLimiter getRateLimit(String resource) {  
  25.         RateLimiter limit = resourceLimitMap.get(resource);   
  26.         if(limit == null) {  
  27.             synchronized(RateLimiterUtils.class) {  
  28.                 limit = resourceLimitMap.get(resource);  
  29.                 double qps = getQpsByResource(resource);  
  30.                 if(limit == null) {  
  31.                     limit = RateLimiter.create(qps);  
  32.                     resourceLimitMap.put(resource, limit);  
  33.                     LoggerUtil.info(RateLimiterUtils.class, "create rate limiter for key:{0},QPS:{1}", resource,qps);  
  34.                 }  
  35.             }  
  36.         }  
  37.         return resourceLimitMap.get(resource);  
  38.     }  
  39. }  



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
如何实现漏桶算法与令牌桶算法
对高并发流量控制的一点思考
一文搞定算法和架构,微服务接口限流不用愁!
高并发的场景下,不能不说的限流算法
使用RateLimiter完成简单的大流量限流,抢购秒杀限流
Spring Cloud Alibaba | Sentinel: 服务限流高级篇
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服