System design · LLD design

Rate Limiter

ClientType enum

PREMIUM , NORMAL

Client
-clientId
-ClientType

+getClientType()

RateLimitConfig
-ClientType
-maxRequest
-windowMillis

+getRateLimitConfig(clientType)

RateLimiterStore - interface
+incrementAndGet(key)
+get(key)

InMemoryRateLimiterStore - implement RateLimiterStore

-ConcurrentHashMap<String, AtomicLong> counters;

+incrementAndGet(key)
+get(key)

RateLimiterAlgorithmFactory - factory
-HashMap <ClientType , RateLimiterAlgorithm>
For eg for premium use SlidingWindowCounterStragey
+getRateLimiterStrategy(clientType)

RateLimiterAlgorithm - interface
+allowRequest(RateLimiterStore, clientId , maxRequest , windowMillis)

FixedWindowCounterStrategy - implement RateLimiterAlgorithm
+allowRequest(RateLimiterStore, clientId , maxRequest , windowMillis)

SlidingWindowCounterStragey - implement RateLimiterAlgorithm
+allowRequest(RateLimiterStore, clientId , maxRequest , windowMillis)

RateLimiter
-RateLimiterStore store
-RateLimiterAlgorithmFactory factory

+allowRequest(Client)
ratelimit config = getRateLimitConfig(client.getClientType())
Algo = getRateLimiterStrategy(clientType)
algo.allowRequest(sotre, clientid , config.getmaxRequest , config.getwindowmillis)