服务限流之令牌桶算法

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2021-12-21 10:37 被阅读0次

上一篇 <<<服务限流之滑动窗口计数
下一篇 >>>服务限流之漏桶算法


令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。
令牌桶算法的描述如下:
假设限制2r/s,则按照500毫秒的固定速率往桶中添加令牌;
桶中最多存放b个令牌,当桶满时,新添加的令牌被丢弃或拒绝;
当一个n个字节大小的数据包到达,将从桶中删除n个令牌,接着数据包被发送到网络上;
如果桶中的令牌不足n个,则不会删除令牌,且该数据包将被限流(要么丢弃,要么缓冲区等待)。

<dependencies>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>25.1-jre</version>
    </dependency>
</dependencies>

/*
 * RateLimiter是guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率。
 * 使用RateLimiter 实现令牌通方式限流
 */
@RestController
public class IndexController {
   @Autowired
   private OrderService orderService;
   // create 方法中传入一个参数 以每秒为单位固定的速率值 1r/s 每秒中往桶中存入一个令牌
   RateLimiter rateLimiter = RateLimiter.create(100); // 独立线程

   // 相当于该接口每秒钟时间 只能支持一个客户端访问
   @RequestMapping("/addOrder")
   public String addOrder() {
      // 1.限流处理 限流正常要放在网关 客户端从桶中获取对应的令牌,为什么返回double结果,这个结果表示 从桶中拿到令牌等待时间.
      // 2. 如果获取不到令牌,就会一直等待.设置服务降级处理(相当于配置在规定时间内如果没有获取到令牌的话,直接走服务降级。)
      // double acquire = rateLimiter.acquire();
      //
      // System.out.println("从桶中获取令牌等待的时间:" + acquire);
      // 如果在500毫秒内如果没有获取到令牌的话,则直接走服务降级处理
      boolean tryAcquire = rateLimiter.tryAcquire(500, TimeUnit.MILLISECONDS);
      if (!tryAcquire) {
         System.out.println("别抢了, 在抢也是一直等待的, 还是放弃吧!!!");
         return "别抢了, 在抢也是一直等待的, 还是放弃吧!!!";
      }
      // 2. 业务逻辑处理
      boolean addOrderResult = orderService.addOrder();
      if (addOrderResult) {
         System.out.println("恭喜您,抢购成功! 等待时间:" + rateLimiter.acquire());
         return "恭喜您,抢购成功!";
      }
      return "抢购失败!";
   }
}

推荐阅读:
<<<高并发架构的整体思路
<<<一个网站访问慢的真正原因
<<<高并发情况下,接口的代码会存在哪些问题
<<<压缩静态资源减少带宽传输的方式
<<<动静分离架构模式
<<<缓存策略汇总
<<<后端服务的雪崩效应及解决思路
<<<服务的隔离、降级和熔断
<<<服务限流之计数器方式
<<<服务限流之滑动窗口计数
<<<服务限流之漏桶算法
<<<漏桶算法和令牌桶算法的区别
<<<自定义封装限流算法
<<<应用级限流
<<<接入层限流

相关文章

  • 基础架构 | 限流算法

    限流算法 令牌桶算法 漏桶算法

  • Nginx 限流配置(转)

    限流算法: 1. 令牌桶算法 算法思想是: 令牌以固定速率产生,并缓存到令牌桶中;令牌桶放满时,多余的令牌被丢弃;...

  • Nginx限流配置(转载)

    1、限流算法 令牌桶算法 算法思想是:a、令牌以固定速率产生,并缓存到令牌桶中;b、令牌桶放满时,多余的令牌被丢弃...

  • 漏桶算法与令牌桶算法的区别

    令牌桶算法是通过控制令牌生成的速度进行限流,漏桶算法是控制请求从桶中流出的速度进行限流。简单理解为:令牌桶控制进,...

  • 高并发下的Nginx实用配置 - 限流和黑白名单

    1. 限流算法 漏桶算法 令牌桶算法 更多限流算法相关知识,请查看【单机限流 - 限流算法及隔离策略】[https...

  • 限流框架系列之常见限流算法

    四种常见的限流算法 固定时间窗口限流算法 滑动时间窗口限流算法 令牌桶限流算法 漏桶限流算法 算法比较 算法确定参...

  • nginx限流算法

    1 限流算法 1.令牌桶 算法思想:*令牌以固定速率产生,并缓存到令牌桶中;*令牌桶放满时,多余的令牌被丢弃;*请...

  • 服务限流之令牌桶算法

    上一篇 <<<服务限流之滑动窗口计数[https://www.jianshu.com/p/f374d7cf3b11...

  • 2020-06-09

    目录 代理层限流 容器限流 API 限流 时间窗口 漏桶算法 令牌桶算法 总结 为了保护暴露在公网...

  • Guava-RateLimiter详解

    常用的限流算法有漏桶算法和令牌桶算法,guava的RateLimiter使用的是令牌桶算法,也就是以固定的频率向桶...

网友评论

    本文标题:服务限流之令牌桶算法

    本文链接:https://www.haomeiwen.com/subject/mxlrfrtx.html