令牌桶限流算法使用整理

令牌桶算法用于限制网络流量,确保数据以均匀速度发送。Guava库提供了RateLimiter实现,例如创建每秒放行10个请求的令牌桶。当无令牌时,可以选择等待获取或设定超时策略。该算法适用于处理瞬时大流量,能应对突发请求并限制平均速率。
摘要由CSDN通过智能技术生成
  • 令牌桶原理

    • image-20220409161712358.png
    • 最初来源于计算机网络。在网络传输数据时,为了防止网络拥塞,需限制流出网络的流量,使流量以比较均匀的速度向外发送。
    • 牌桶算法就实现了这个功能,可控制发送到网络上数据的数目,并允许突发数据的发送。大小固定的令牌桶可自行以恒定的速率源源不断地产生令牌。如果令牌不被消耗,或者被消耗的速度小于产生的速度,令牌就会不断地增多,直到把桶填满。后面再产生的令牌就会从桶中溢出。最后桶中可以保存的最大令牌数永远不会超过桶的大小。这意味,面对瞬时大流量,该算法可以在短时间内请求拿到大量令牌,而且拿令牌的过程并不是消耗很大的事情。
  • 后端操作步骤

    • 引入依赖

    java <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>28.2-jre</version> </dependency>

    • 基本使用

    ```java //创建令牌桶实例,写10代表每秒放行十个请求 private RateLimiter rateLimiter = RateLimiter.create(40);

    @PostMapping("sale") public String sale(Integer id){ //可采用的策略 //1.没有获取到token请求就一直等,直到获取到token log.info("等待的时间:" + rateLimiter.acquire()); //2.设置一个等待时间,如果在等待的时间内获取到了token令牌,则处理业务,如果没有获取到则抛弃,不继续处理业务 //如果超时还没拿到 if(!rateLimiter.tryAcquire(2,TimeUnit.SECONDS)){ System.out.println("请求被限流,无法调用后续逻辑"); return "抢购失败"; } //处理业务代码省略 return "抢购成功"; } ```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值