Skip to content

java-limiter · 疾限Java 8+ 无锁限流库

一个 18 KB 的 jar、六种算法、零运行时依赖、没有后台线程。

java-limiter

引入 ​

xml
<dependency>
    <groupId>io.github.onblog</groupId>
    <artifactId>java-limiter</artifactId>
    <version>1.0.0</version>
</dependency>
groovy
implementation 'io.github.onblog:java-limiter:1.0.0'

第一个限流器 ​

java
import io.github.onblog.limiter.RateLimiter;
import io.github.onblog.limiter.RateLimiters;

import java.time.Duration;

// 平均每秒 100 次,允许最多 200 次的突发
RateLimiter limiter = RateLimiters.tokenBucket("payments", 200, 100, Duration.ofSeconds(1));

if (limiter.tryAcquire()) {
    handleRequest();
} else {
    response.setStatus(429);
}

被限流不是异常:tryAcquire 返回 false,既不抛异常也不打日志。

六种算法怎么选 ​

限流器行为适用场景
TokenBucketLimiter平均速率 + 空闲时累积的突发额度对外 API、保护能容忍突发的下游
LeakyBucketLimiter严格匀速放行,永不累积突发调用外部接口、MQ 消费等要求平滑的场景
SlidingWindowLimiter任意滑动窗口内不超过 N 次登录尝试、按分钟/小时计配额且边界不可被利用
FixedWindowLimiter固定窗口内不超过 N 次,一个 AtomicLong流量极高、精度要求宽松
WarmUpTokenBucketLimiter冷启动时只有 1/3 速率,按预热时长线性爬升刚启动就承载流量的服务
ConcurrencyLimiter限的是同时在飞数,不是每秒次数保护线程池、连接池、响应慢的下游

每种算法怎么实现、并发下保证什么,见算法原理。

English documentation ​

The full documentation is also available in English: English.