Rate limiter

mail@pastecode.io avatar
unknown
java
a month ago
1.9 kB
1
Indexable
Never
import java.util.LinkedList;
import java.util.Queue;

// RateLimiter Interface
public interface RateLimiter {
    boolean acquire(); // Try to acquire a permit
}

// SlidingWindowRateLimiter Class
public class SlidingWindowRateLimiter implements RateLimiter {

    private final int maxRequests; // Maximum number of requests allowed
    private final long windowSize; // Size of the time window in milliseconds
    private final Queue<Long> requestTimestamps; // Timestamps of requests

    public SlidingWindowRateLimiter(int maxRequests, long windowSize) {
        this.maxRequests = maxRequests;
        this.windowSize = windowSize;
        this.requestTimestamps = new LinkedList<>();
    }

    @Override
    public synchronized boolean acquire() {
        long now = System.currentTimeMillis();
        
        // Remove timestamps outside the window
        while (!requestTimestamps.isEmpty() && now - requestTimestamps.peek() > windowSize) {
            requestTimestamps.poll();
        }

        if (requestTimestamps.size() < maxRequests) {
            requestTimestamps.add(now);
            return true;
        } else {
            return false;
        }
    }
}

// Main Application for Demonstration
public class RateLimiterDemo {
    public static void main(String[] args) throws InterruptedException {
        // Create a rate limiter with a maximum of 5 requests per 10 seconds
        SlidingWindowRateLimiter rateLimiter = new SlidingWindowRateLimiter(5, 10000);

        // Try to acquire permits
        for (int i = 0; i < 10; i++) {
            if (rateLimiter.acquire()) {
                System.out.println("Request allowed: " + i);
            } else {
                System.out.println("Request denied: " + i);
            }
            Thread.sleep(1000); // Simulate some delay between requests
        }
    }
}
Leave a Comment