使用RateLimiter完成简单的大流量限流,抢购秒杀限流。
RateLimiter是guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率。
通常可应用于抢购限流防止冲垮系统;限制某接口、服务单位时间内的访问量,譬如一些第三方服务会对用户访问量进行限制;限制网速,单位时间内只允许上传下载多少字节等。
下面来看一些简单的实践demo,需要先引入guava的maven依赖。
Demo1.有很多任务,但希望每秒不超过N个

        import com.google.common.util.concurrent.RateLimiter;  import java.util.ArrayList;  import java.util.List;  import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;  /** *  * 有很多个任务,但希望每秒不超过X个,可用此类 */  public class Demo1 {  public static void main(String[] args) {  //0.5代表一秒最多多少个  RateLimiter rateLimiter = RateLimiter.create(0.5);  List<Runnable> tasks = new ArrayList<Runnable>();  for (int i = 0; i < 10; i++) {  tasks.add(new UserRequest(i));  }  ExecutorService threadPool = Executors.newCachedThreadPool();  for (Runnable runnable : tasks) {  System.out.println("等待时间:" + rateLimiter.acquire());  threadPool.execute(runnable);  }  }  private static class UserRequest implements Runnable {  private int id;  public UserRequest(int id) {  this.id = id;  }  public void run() {  System.out.println(id);  }  }  }

Demo2.抢购场景限流
如我们预估数据库能承受并发10,超过了可能会造成故障,我们就可以对该请求接口进行限流。

        import com.google.common.util.concurrent.RateLimiter;  import com.tianyalei.model.GoodInfo;  import com.tianyalei.service.GoodInfoService;  import org.springframework.web.bind.annotation.RequestMapping;  import org.springframework.web.bind.annotation.RestController;  import javax.annotation.Resource;  @RestController  public class IndexController {  @Resource(name = "db")  private GoodInfoService goodInfoService;  RateLimiter rateLimiter = RateLimiter.create(10);  @RequestMapping("/miaosha")  public Object miaosha(int count, String code) {  System.out.println("等待时间" + rateLimiter.acquire());  if (goodInfoService.update(code, count) > 0) {  return "购买成功";  }  return "购买失败";  }  @RequestMapping("/add")  public Object add() {  for (int i = 0; i < 100; i++) {  GoodInfo goodInfo = new GoodInfo();  goodInfo.setCode("iphone" + i);  goodInfo.setAmount(100);  goodInfoService.add(goodInfo);  }  return "添加成功";  }  }  

Demo3.抢购场景降级

     /** * tryAcquire(long timeout, TimeUnit unit) * 从RateLimiter 获取许可如果该许可可以在不超过timeout的时间内获取得到的话, * 或者如果无法在timeout 过期之前获取得到许可的话,那么立即返回false(无需等待) */  @RequestMapping("/buy")  public Object miao(int count, String code) {  //判断能否在1秒内得到令牌,如果不能则立即返回false,不会阻塞程序  if (!rateLimiter.tryAcquire(1000, TimeUnit.MILLISECONDS)) {  System.out.println("短期无法获取令牌,真不幸,排队也瞎排");  return "失败";  }  if (goodInfoService.update(code, count) > 0) {  System.out.println("购买成功");  return "成功";  }  System.out.println("数据不足,失败");  return "失败";  }  

RateLimiter高并发访问限流相关推荐

  1. 互联网高并发解决方案(2)--高并发服务限流特技

    RPC和本地JAVA调用的区别 RPC远程调用:一般是可以跨平台使用的,采用Socket技术,只要语言支持socket技术就可以进行互相通信.其实就是socket+反射实现的. 本地调用:只能支持Ja ...

  2. 高并发系统限流-漏桶算法和令牌桶算法

    参考: https://www.cnblogs.com/xuwc/p/9123078.html http://www.cnblogs.com/LBSer/p/4083131.html https:// ...

  3. 高并发系统--限流算法

    在开发高并发系统时,有三把利器用来保护系统:缓存.降级和限流.通过限流,我们可以很好地控制系统的qps,从而达到保护系统的目的.主要算法有:计数器算法,滑动窗口算法,漏桶算法,令牌桶算法 1.计数器算 ...

  4. javaweb对于高并发策略--限流

    1.对于后端开发来说基本策略:缓存,限流,降级 缓存 缓存比较好理解,在大型高并发系统中,如果没有缓存数据库将分分钟被爆,系统也会瞬间瘫痪.使用缓存不单单能够提升系统访问速度.提高并发访问量,也是保护 ...

  5. 高并发系统限流最佳实践

    缓存 缓存比较好理解,在大型高并发系统中,如果没有缓存数据库将分分钟被爆,系统也会瞬间瘫痪. 使用缓存不单单能够提升系统访问速度.提高并发访问量,也是保护数据库.保护系统的有效方式.大型网站一般主要是 ...

  6. 【面试大全-高并发】-限流策略有哪些,滑动窗口算法和令牌桶区别,使用场景

    参考思路:限流算法常用的几种实现方式有如下四种:计数器.滑动窗口.漏桶和令牌桶: ● 计数器: ○ 思想:在固定时间窗口内对请求进行计数,与阀值进行比较判断是否需要限流,一旦到了时间临界点,将计数器清 ...

  7. 【java】高并发之限流 RateLimiter使用

    1.概述 转载原文:高并发之限流 你可能知道高并发系统需要限流这个东西,但具体是限制的什么,该如何去做,还是模凌两可.我们接下来系统性的给它归个小类,希望对你有所帮助. google guava中提供 ...

  8. 令牌桶算法和漏桶算法有什么区别_高并发之限流,到底限的什么鬼 (精品长文)...

    你可能知道高并发系统需要限流这个东西,但具体是限制的什么,该如何去做,还是模凌两可.我们接下来系统性的给它归个小类,希望对你有所帮助. google guava中提供了一个限流实现: RateLimi ...

  9. 分布式系统并发请求限流平台Sentinel功能特性调研-集成测试(中篇)

    摘 要 随着近些年系统稳定性要求越来越高,而系统限流则是其中提高系统稳定性的手段之一,而在众多限流平台中Sentinel凭着丰富功能特性和多次阿里双十一的线上实践,成为最热门限流平台之一,本文就Sen ...

最新文章

  1. Swift 对象内存模型探究(一)
  2. nginx+tomcat的负载均衡
  3. oracle 12c dg新特性,oracle 12c:新特性-网格(Grid)基础架构的增强
  4. C++中IDispatch接口
  5. 石油采集(求联通区域) 2018多校寒假集训 (dfs+二分匹配)
  6. Fiddle:使用断点:bpu,bpafter
  7. php异步查询数据库,php中mysql数据库异步查询实现
  8. React开发(134):ant design学习指南之form中getFieldValue
  9. RAC(ReactiveCocoa)使用方法(二)
  10. 在centos7安装nodejs并升级nodejs到最新版本
  11. VMware网络设置
  12. html简单随机抽奖页面(在线抽奖、随机选取、自动挑选)
  13. 表白生成器PHP源码,表白网页在线生成源码
  14. matlab-线性代数 根据方程组写出系数矩阵与增广矩阵
  15. python苹果手机触摸_python实现查询苹果手机维修进度
  16. 嵌入式硬件从接杜邦线起-杜邦头接线实操①
  17. 聊聊手机之--小米6
  18. 谷歌面试题之扔鸡蛋的问题(蓝桥杯摔手机的问题)
  19. NUnit的入门学习
  20. 数据分析师三个等级_数据分析课|这三个等级的数据分析师报考条件,一定是你需要的...

热门文章

  1. Java中文与Base64互转(解决中文乱码的问题)
  2. 找不到gpedit.msc文件
  3. [MEM]综合能力考试-数学知识点
  4. 【电路仿真01】bandgap
  5. 矩阵理论复习(十一)
  6. Flutter事件分发
  7. socket error 10038查错
  8. KaTex的一个简单例子
  9. Lock-step 锁步核有哪些
  10. kali初讲——Metasploit工具MSF初学