जावा में रेट लिमिटिंग: सिद्धांत से व्यावहारिक कार्यान्वयन तक
रेट लिमिटिंग (अनुरोधों की गति को सीमित करना) आधुनिक वितरित प्रणालियों में सुरक्षा और लोड प्रबंधन के प्रमुख तंत्रों में से एक है। जावा में, यह कार्य अंतर्निहित साधनों के स्तर पर और विशेष लाइब्रेरीज़ की सहायता से हल किया जाता है। इस लेख में हम मुख्य एल्गोरिदम, लोकप्रिय लाइब्रेरीज़ का विश्लेषण करेंगे और काम करने वाले कोड उदाहरण प्रस्तुत करेंगे।
रेट लिमिटिंग की आवश्यकता क्यों है?
रेट लिमिटिंग निम्नलिखित की अनुमति देता है:
- API को दुरुपयोग (DDoS, पासवर्ड ब्रूट-फोर्स) से बचाना
- बैकएंड पर लोड को समान रूप से वितरित करना
- सेवा स्तर समझौतों (SLA) का पालन करना
- बाहरी सेवाओं की कोटा सीमा से अधिक होने से रोकना
रेट लिमिटिंग के मुख्य एल्गोरिदम
लाइब्रेरी चुनने से पहले यह समझना महत्वपूर्ण है कि कौन से एल्गोरिदम आधार में हैं:
1. Token Bucket (Bucket4j, Guava)
क्लासिक एल्गोरिदम। एक "बकेट" में एक निश्चित दर से टोकन जोड़े जाते हैं। प्रत्येक अनुरोध एक या अधिक टोकन लेता है। यदि टोकन नहीं हैं, तो अनुरोध अस्वीकार कर दिया जाता है।
// स्यूडोकोड में उदाहरणclass TokenBucket { private int tokens; private long lastRefillTime; private final int capacity; private final double refillRate; // प्रति सेकंड टोकन
synchronized boolean tryConsume() { refill(); if (tokens > 0) { tokens--; return true; } return false; }}2. Sliding Window Log
पिछले अनुरोधों के टाइमस्टैम्प संग्रहीत करता है। प्रत्येक नए अनुरोध पर, विंडो से पुराने टाइमस्टैम्प हटा दिए जाते हैं और जाँच की जाती है कि सीमा पार तो नहीं हुई है। सटीक, लेकिन टाइमस्टैम्प संग्रहीत करने के लिए मेमोरी की आवश्यकता होती है।
3. Fixed Window Counter
एक निश्चित अंतराल (जैसे, प्रति मिनट 100 अनुरोध) के लिए एक सरल काउंटर। हर मिनट रीसेट होता है। विंडो की सीमाओं पर "पीक" लोड के लिए संवेदनशील।
रेट लिमिटिंग के लिए लोकप्रिय Java लाइब्रेरीज़
1. Bucket4j
Bucket4j एक परिपक्व लाइब्रेरी है जो Token Bucket एल्गोरिदम को पूरी तरह से लागू करती है। Redis, Hazelcast, JCache के माध्यम से वितरित परिदृश्यों का समर्थन करती है। Java 8+ API है।
स्थापना (Maven):
<dependency> <groupId>com.github.vladimir-bukhtoyarov</groupId> <artifactId>bucket4j-core</artifactId> <version>8.7.0</version></dependency>उपयोग का उदाहरण:
import io.github.bucket4j.*;import java.time.Duration;
public class Bucket4jExample { public static void main(String[] args) { // बकेट बनाएँ: 10 टोकन, प्रति सेकंड 1 टोकन की दर से भरना Bandwidth limit = Bandwidth.simple(10, Duration.ofSeconds(1)); Bucket bucket = Bucket4j.builder().addLimit(limit).build();
for (int i = 0; i < 15; i++) { if (bucket.tryConsume(1)) { System.out.println("अनुरोध #" + i + " निष्पादित"); } else { System.out.println("अनुरोध #" + i + " अस्वीकृत (सीमा पार)"); } } }}2. Resilience4j RateLimiter
दोष-सहिष्णुता के लिए लोकप्रिय फ्रेमवर्क का हिस्सा। SemaphoreBasedRateLimiter या AtomicRateLimiter पर आधारित काम करता है। Spring Boot के साथ आसानी से एकीकृत होता है।
कॉन्फ़िगरेशन का उदाहरण:
import io.github.resilience4j.ratelimiter.*;import java.time.Duration;
public class Resilience4jExample { public static void main(String[] args) { RateLimiterConfig config = RateLimiterConfig.custom() .limitForPeriod(5) // 5 अनुरोध .limitRefreshPeriod(Duration.ofSeconds(1)) // हर सेकंड .timeoutDuration(Duration.ofMillis(100)) .build();
RateLimiter rateLimiter = RateLimiter.of("myService", config);
for (int i = 0; i < 8; i++) { Runnable task = R