AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
토큰 버킷 알고리즘 기반 Java 속도 제한 라이브러리
Java rate limiting library based on token-bucket algorithm.
개발 도구Java · HTMLGitHub @bucket4j직접 설치운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗The Bucket4j is distributed through Maven Central:
<!-- For java 17+ -->
<dependency>
<groupId>com.bucket4j</groupId>
<artifactId>bucket4j_jdk17-core</artifactId>
<version>8.21.0</version>
</dependency>
import io.github.bucket4j.Bucket;
...
// bucket with capacity 20 tokens and with refilling speed 1 token per each 6 second
private static Bucket bucket = Bucket.builder()
.addLimit(limit -> limit.capacity(20).refillGreedy(10, Duration.ofMinutes(1)))
.build();
private void doSomethingProtected() {
if (bucket.tryConsume(1)) {
doSomething();
} else {
throw new SomeRateLimitingException();
}
}
More examples can be found there
In additional to basic features described above, Bucket4j provides ability to implement rate-limiting in cluster of JVMs:
Bucket4j is not a framework, it is a library, with Bucket4j you need to write a code to achive your goals. For generic use-cases, try to look at powerfull Spring Boot Starter for Bucket4j, that allows you to set access limits on your API effortlessly. Its key advantage lies in the configuration via properties or yaml files, eliminating the need for manual code authoring.
In addition to local in-memory buckets, the Bucket4j supports clustered usage scenario on top of following back-ends:
| Back-end | Async supported | Flexible per-entry expiration | Optimized serialization | Thin-client support | Documentation link |
|---|---|---|---|---|---|
JCache API (JSR 107) | No | No | No | No | bucket4j-jcache |
Hazelcast | Yes | Yes | Yes | No | bucket4j-hazelcast |
Apache Ignite | Yes | No | n/a | Yes | bucket4j-ignite |
Apache Ignite 3 | Yes | No | n/a | Yes | bucket4j-ignite3 |
Inifinispan | Yes | Yes | Yes | No | bucket4j-infinispan |
Oracle Coherence | Yes | Yes | Yes | No | bucket4j-coherence |
| Back-end | Async supported | Redis cluster supported | Documentation link |
|---|---|---|---|
Redis/Vert.x Redis Client | Yes | Yes | bucket4j-redis/Vert.x |
Redis/Redisson | Yes | Yes | bucket4j-redis/Redisson |
Redis/Jedis | No | Yes | bucket4j-redis/Jedis |
Redis/Lettuce | Yes | Yes | bucket4j-redis/Lettuce |
| Back-end | Async supported | Redis cluster supported | Documentation link |
|---|---|---|---|
Valkey/Glide | Yes | Yes | bucket4j-valkey/Glide |
| Back-end | Async supported | Documentation link |
|---|---|---|
Mongodb/mongodb-driver-sync | No | bucket4j-mongodb/sync |
Mongodb/mongodb-driver-reactivestreams | Yes | bucket4j-mongodb/async |
| Back-end | Async supported | Documentation link |
|---|---|---|
Memcached/compare-and-swap based | Yes | bucket4j-memcached |
| Back-end | Async supported | Documentation link |
|---|---|---|
Apache Cassandra/Lightweight Transactions | Yes | bucket4j-cassandra |
| Back-end | Documentation link |
|---|---|
MySQL | bucket4j-mysql |
PostgreSQL | bucket4j-postgresql |
Oracle | bucket4j-oracle |
Microsoft SQL Server | bucket4j-mssql |
MariaDB | bucket4j-mariadb |
DB2 | bucket4j-db2 |
Sometimes you are having deal with bucket per key scenarios but distributed synchronization is unnecessary, for example where request stickiness is provided by a load balancer, or other use-cases where stickiness can be achieved by the application itself, for example, Kafka consumer. For such scenarios Bucket4j provides support for following list of local caching libraries:
| Back-end | Documentation link |
|---|---|
Caffeine | bucket4j-caffeine |
| Back-end | Project page |
|---|---|
Datomic Database | clj-bucket4j-datomic |
Every commit/merge to the master branch is automatically built and published as a -SNAPSHOT artifact to GitHub Packages (see .github/workflows/snapshot-release.yml).
To consume a snapshot, add the GitHub Packages repository to your pom.xml:
<repositories>
<repository>
<id>github</id>
<name>Bucket4j GitHub Packages</name>
<url>https://maven.pkg.github.com/bucket4j/bucket4j</url>
</repository>
</repositories>
GitHub Packages requires authentication even for reading public packages, so add a server entry with your GitHub username and a personal access token that has the read:packages scope to your ~/.m2/settings.xml:
<servers>
<server>
<id>github</id>
<username>YOUR_GITHUB_USERNAME</username>
<password>YOUR_GITHUB_TOKEN</password>
</server>
</servers>
Then reference the snapshot version (current pom.xml version with the -SNAPSHOT suffix), for example:
<dependency>
<groupId>com.bucket4j</groupId>
<artifactId>bucket4j_jdk17-core</artifactId>
<version>8.22.0-SNAPSHOT</version>
</dependency>
Feel free to ask via:
Copyright 2015-2026 Vladimir Bukhtoyarov Licensed under the Apache Software License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0.
Couchbase | Yes | Yes | Yes | No | bucket4j-couchbase |
Apache Geode (GemFire) | No | No | n/a | No | bucket4j-geode |