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)