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.
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}