Guava RateLimiter限流问题

问题背景

  有一个需求,需要进行限流,选择使用的Guava RateLimiter,但是发现在限流方面,还是存在一些问题(单机),特别是当瞬时访问量特别大的时候,

  请看下面一个代码,应该输出什么结果?

package cn.ganlixin.guava;

import com.google.common.util.concurrent.RateLimiter;
import org.junit.Test;

import java.time.LocalTime;

public class UserRateLimiter {

    @Test
    public void testSimple() {
        // 创建一个限流器(每秒限制流量为5个)
        RateLimiter rateLimiter = RateLimiter.create(5.0);
        for (int i = 0; i < 10; i++) {
            if (rateLimiter.tryAcquire()) {
                System.out.println(LocalTime.now() + " 通过");
            } else {
                System.out.println(LocalTime.now() + " 被限流");
            }
        }
    }
}

  运行上面的代码,输出结果如下:

15:05:37.655 通过
15:05:37.655 被限流
15:05:37.655 被限流
15:05:37.656 被限流
15:05:37.656 被限流
15:05:37.656 被限流
15:05:37.656 被限流
15:05:37.656 被限流
15:05:37.656 被限流
15:05:37.656 被限流

  可以看到,上面的运行输出中,只有1个请求通过没有被限流,其余9个都被限流了。

  这和我预期的结果有出入,预期应该是有5个通过,5个被限流。

原文地址:https://www.cnblogs.com/-beyond/p/12287219.html

时间: 2024-07-31 09:47:31

Guava RateLimiter限流问题的相关文章

RateLimiter限流

1.处理高并发 1.1高并发处理方案: 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开 限流 限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务.排队或等待.降级等处理 1.2限流方式: mq.ratelimiter 2.ratelimiter是基于令牌桶算法来做的 guava的RateLimiter使用的是令牌桶算法,也就是以固定

SpringCloud(8)----zuul权限校验、接口限流

项目代码GitHub地址:https://github.com/yudiandemingzi/spring-cloud-study 一.权限校验搭建 正常项目开发时,权限校验可以考虑JWT和springSecurity结合进行权限校验,这个后期会总结,这里做个基于ZuulFilter过滤器进行一个简单的权限校验过滤. 对于组件zuul中,其实带有权限认证的功能,那就是ZuulFilter过滤器.ZuulFilter是Zuul中核心组件,通过继承该抽象类,覆写几个关键方法达到自定义调度请求的作用

Guava的RateLimiter实现接口限流

最近开发需求中有需要对后台接口进行限流处理,整理了一下基本使用方法. 首先添加guava依赖: <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.0</version> </dependency> 然后封装RateLimiter适用对多接口的限制: import com.goog

最近学习了限流与RateLimiter

前言 分布式环境下应对高并发保证服务稳定几招,按照个人理解,优先级从高到低分别为缓存.限流.降级.熔断,每招都有它的作用,本文重点就讲讲限流这部分. 坦白讲,其实上面的说法也不准确,因为服务降级.熔断本身也是限流的一种,因为它们本质上也是阻断了流量进来,但是本文希望大家可以把限流当做一个单纯的名词来理解,看一下对请求做流控的几种算法及具体实现方式. 为什么要限流 其实很好理解的一个问题,为什么要限流,自然就流量过大了呗,一个对外服务有很多场景都会流量增大: 业务用户量不断攀升 各种促销 网络爬虫

使用RateLimiter完成简单的大流量限流,抢购秒杀限流

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

coding++:高并发解决方案限流技术-使用RateLimiter实现令牌桶限流-Demo

RateLimiter是guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率. 通常可应用于抢购限流防止冲垮系统:限制某接口.服务单位时间内的访问量,譬如一些第三方服务会对用户访问量进行限制:限制网速,单位时间内只允许上传下载多少字节等. guava的maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guav

高并发学习之使用RateLimiter实现令牌桶限流

RateLimiter是guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率.通常可应用于抢购限流防止冲垮系统:限制某接口.服务单位时间内的访问量,譬如一些第三方服务会对用户访问量进行限制:限制网速,单位时间内只允许上传下载多少字节等. guava的maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava

网站限流处理

1.常见两种方式 漏桶算法和令牌桶算法 漏桶算法:1.有一个固定容量的漏桶,已固定的速率流出水滴. 2.可以任意速率流入水滴到漏桶 3.当漏桶满了,水溢出(相当于丢弃) 令牌桶算法: 1.以固定的速率向桶里放令牌 2.当桶内的令牌数量达到最大值后,后续放入的令牌被丢弃 3.当需要发送N个单位大小的数据时,就从桶内去N个令牌 4.当桶内的令牌数量小于设定的大小时,不能删除令牌,也就是不能发送数据,这是数据可能被丢弃,也可能被缓冲区缓存下来. 2.其它方式 统计计数,主要思想是记录指定时间内的访问量

接口限流

一.什么是限流 使资源以限定的速率被使用.比如:地铁限流,高峰时段限制单位时间内的客流量:电路中的限流器,可以保证电路不超过额定的电流:网站限流,抢购,瞬间的高峰对于后台来说肯定是需要一个限流处理为可接受的速率进行处理. 二.为什么要限流 比如:地铁不限流量,挤爆了:电路不限流,灯爆了:网站不限流,撑爆了. 三.限流的几种方式 常用的限流算法有两种:漏桶算法和令牌桶算法. 漏桶算法:桶中水以限定的速度流出来.缺点:水满溢出.突发请求不能尽快处理,被调整为固定速率. 令牌桶算法:系统会以一个限定的