Guava 的速率限制器 - 更改许可证颁发的速率

问题描述 投票:0回答:2

我想在 spring boot 中为我们所有的应用程序请求实现一个节流机制 我选择在 OncePerRequestFilter 中捕获所有 http 请求,并在 3 个案例中使用 guava rate-limiter 一个一般有 1000 个请求/秒,另外两个将通过 ip /小时/秒限制请求

假设我每秒有 5 个 api 调用许可 如果我有 5 个线程同时或以小于 200 毫秒的间隔到达,我仍然希望它们全部通过

EX.

0............ 1 sec
 12345 -------

0 ............ 1 sec
   ------12345

我怎样才能让它工作

测试这个并且只允许访问两个或三个线程然后阻塞其余的,这是正常的,因为许可率是固定的间隔(仅在 200ms 之后)

java multithreading spring-boot concurrency guava
2个回答
0
投票

提供代码示例总是一个好主意,这样我们就可以看到是什么导致了您试图改变的行为。

根据 Javadoc,一个空闲的

RateLimiter
将允许最多
permitsPerSecond
的批准,然后开始以 1/pps 秒的间隔颁发许可证。

RateLimiter
视为维护一袋代币是很有用的。获得许可会删除令牌。如果已经少于 pps 令牌,则定期添加一个新令牌。这并不是它实际工作的确切方式,但它足够接近以帮助您了解正在发生的事情。

因此,换句话说,

RateLimiter
似乎已经按照您的意愿行事。也许我误解了你的问题?


0
投票

感谢您的回答,在我的情况下,我不会有太多的突发事件,因为我们的应用程序在全球范围内被超过 50.000 名用户持续 24/24 使用,我想要的是,如果我收到第二个 10 请求同时,假设我的速率限制器是每秒 10 个许可,我想允许所有请求同时通过,但在这种情况下谷歌限制器的工作方式,它只会在 200 毫秒后允许第二个请求,这不是我想要的,所以我想创建一个过期队列,我将在其中保存 ip 和一个计数器,并且对于每次获取,如果计数器达到限制,我将检查队列,在我的例子中是 10

© www.soinside.com 2019 - 2024. All rights reserved.