Resilience

resilience4RateLimiter

Path
pkg18resiliencepatterns/resilience4RateLimiter.java
Package
pkg18resiliencepatterns
Study order
4
Run
Single-file source launch
Command
java pkg18resiliencepatterns/resilience4RateLimiter.java

There is no in-browser runner. This is the file from the curriculum, unchanged.

pkg18resiliencepatterns/resilience4RateLimiter.java
1package pkg18resiliencepatterns;2 3import java.util.concurrent.TimeUnit;4 5/*6 * resilience4RateLimiter.java7 * ---------------------------8 * Token-bucket rate limiter: cap requests per time window.9 *10 * DEFINITION:11 *   Allows bursts up to bucket capacity, refills tokens at a steady rate.12 *   Protects your service and downstream dependencies from overload.13 *14 * KEY POINTS:15 *   - acquire() blocks or fails when no tokens available.16 *   - Different from semaphore: tokens refill over time automatically.17 *   - Production: Guava RateLimiter, Resilience4j RateLimiter, API gateways.18 */19public class resilience4RateLimiter {20 21    static class TokenBucket {22        private final double refillPerMs;23        private final int capacity;24        private double tokens;25        private long lastRefill;26 27        TokenBucket(int capacity, double permitsPerSecond) {28            this.capacity = capacity;29            this.tokens = capacity;30            this.refillPerMs = permitsPerSecond / 1000.0;31            this.lastRefill = System.currentTimeMillis();32        }33 34        synchronized boolean tryAcquire() {35            refill();36            if (tokens >= 1) {37                tokens -= 1;38                return true;39            }40            return false;41        }42 43        private void refill() {44            long now = System.currentTimeMillis();45            double added = (now - lastRefill) * refillPerMs;46            if (added > 0) {47                tokens = Math.min(capacity, tokens + added);48                lastRefill = now;49            }50        }51    }52 53    public static void main(String[] args) throws InterruptedException {54        TokenBucket limiter = new TokenBucket(3, 2.0); // burst 3, refill 2/sec55 56        for (int i = 0; i < 8; i++) {57            boolean ok = limiter.tryAcquire();58            System.out.println("request " + i + ": " + (ok ? "allowed" : "throttled"));59            TimeUnit.MILLISECONDS.sleep(200);60        }61    }62}