Java में Rate Limiting: Bucket4j, Resilience4j और Guava के साथ अनुरोध नियंत्रण

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Java में अनुरोध आवृत्ति सीमा (Rate Limiting): लाइब्रेरी और टूल्स का अवलोकन

Rate limiting (अनुरोध आवृत्ति सीमा) वेब सेवाओं, API और माइक्रोसर्विसेज को ओवरलोड, DDoS हमलों और आकस्मिक दुरुपयोग से बचाने के लिए एक महत्वपूर्ण तंत्र है। Java में कई परिपक्व लाइब्रेरी हैं जो विभिन्न एल्गोरिदम लागू करती हैं: सरल काउंटर से लेकर जटिल वितरित सिस्टम तक। इस लेख में, हम तीन मुख्य दृष्टिकोणों पर चर्चा करेंगे: Guava RateLimiter, Bucket4j और Resilience4j, और उनके उपयोग के बारे में जानेंगे।

1. Guava RateLimiter (सरल और हल्का)

Google Guava लाइब्रेरी RateLimiter क्लास प्रदान करती है, जो सिंगल-थ्रेडेड मोड में Token Bucket एल्गोरिदम लागू करती है। यह एक ही JVM प्रक्रिया में स्थानीय उपयोग के लिए आदर्श है।

कार्य सिद्धांत: बकेट एक निश्चित दर से टोकन से भरता है। प्रत्येक अनुरोध एक या अधिक टोकन लेता है। यदि पर्याप्त टोकन नहीं हैं, तो थ्रेड ब्लॉक हो जाता है या अनुरोध अस्वीकार कर दिया जाता है।

Guava RateLimiter का उपयोग उदाहरण:

import com.google.common.util.concurrent.RateLimiter;

public class GuavaRateLimiterExample {
    public static void main(String[] args) {
        // प्रति सेकंड 10 अनुरोधों के लिए RateLimiter बनाएं
        RateLimiter rateLimiter = RateLimiter.create(10.0);

        // आने वाले अनुरोधों का अनुकरण
        for (int i = 0; i < 20; i++) {
            // tryAcquire() true लौटाता है यदि टोकन प्राप्त होता है
            if (rateLimiter.tryAcquire()) {
                System.out.println("अनुरोध " + i + " निष्पादित हुआ");
            } else {
                System.out.println("अनुरोध " + i + " अस्वीकृत (सीमा पार)");
            }
        }
    }
}

लाभ: न्यूनतम निर्भरता, सरलता, कम मेमोरी खपत।
नुकसान: वितरित सिस्टम के लिए उपयुक्त नहीं (इंस्टेंस के बीच सिंक्रोनाइज़ नहीं होता)।

2. Bucket4j (Redis समर्थन के साथ उन्नत Token Bucket)

Bucket4j एक लाइब्रेरी है जो Token Bucket एल्गोरिदम को उन्नत सुविधाओं के साथ लागू करती है: स्टेट स्टोरेज के लिए कई प्रदाताओं का समर्थन (in-memory, Redis, Hazelcast, Infinispan), जो इसे वितरित परिदृश्यों में उपयोग करने की अनुमति देता है।

मुख्य विशेषताएं:

  • greedy और interval-based मोड का समर्थन।
  • विभिन्न समय विंडो के लिए सीमाएं निर्धारित करने की क्षमता (जैसे, प्रति मिनट 100 अनुरोध + प्रति सेकंड 10 अनुरोध)।
  • तैयार फिल्टर और एनोटेशन के माध्यम से Jakarta EE / Spring Boot के साथ एकीकरण।

In-memory स्टोरेज के साथ उदाहरण:

import io.github.bucket4j.Bandwidth;
import io.github.bucket4j.Bucket;
import io.github.bucket4j.Refill;

import java.time.Duration;

public class Bucket4jExample {
    public static void main(String[] args) {
        // सीमा: 10 सेकंड में 5 अनुरोध
        Bandwidth limit = Bandwidth.classic(5, Refill.intervally(5, Duration.ofSeconds(10)));
        Bucket bucket = Bucket.builder()
                .addLimit(limit)
                .build();

        for (int i = 0; i < 10; i++) {
            if (bucket.tryConsume(1)) {
                System.out.println("अनुरोध " + i + " स्वीकृत");
            } else {
                System.out.println("अनुरोध " + i + " अवरुद्ध");
            }
        }
    }
}

लाभ: लचीला कॉन्फ़िगरेशन, वितरित समर्थन, उच्च प्रदर्शन।
नुकसान: Guava की तुलना में अधिक निर्भरताएं।

3. Resilience4j RateLimiter (माइक्रोसर्विस आर्किटेक्चर के लिए)

Resilience4j एक फॉल्ट-टॉलरेंस लाइब्रेरी है जिसमें RateLimiter मॉड्यूल शामिल है। इसे रिएक्टिव प्रोग्रामिंग के सिद्धांतों को ध्यान में रखकर डिज़ाइन किया गया है और यह Spring Boot के साथ आसानी से एकीकृत होता है।

अनुशंसाएँ