C# (.NET) में Rate Limiting: System.Threading.RateLimiting लाइब्रेरी गाइड

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

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

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

C# (.NET) में Rate Limiting: System.Threading.RateLimiting लाइब्रेरी की पूरी गाइड

आधुनिक वेब एप्लिकेशन और माइक्रोसर्विसेज में रिसोर्सेज पर लोड को कंट्रोल करना बेहद जरूरी है। Rate Limiting (रिक्वेस्ट रेट को सीमित करना) एक ऐसा मैकेनिज्म है जो API, डेटाबेस या अन्य कंपोनेंट्स के अत्यधिक उपयोग को रोकता है। .NET इकोसिस्टम में अब एक बिल्ट-इन लाइब्रेरी System.Threading.RateLimiting आ गई है, जो रेट लिमिटिंग को लागू करने के लिए लचीले और परफॉर्मेंट टूल्स प्रदान करती है। इस आर्टिकल में हम इसकी क्षमताओं, आर्किटेक्चर और उपयोग के उदाहरणों को विस्तार से समझेंगे।

System.Threading.RateLimiting क्या है?

System.Threading.RateLimiting एक लाइब्रेरी है जो .NET 7 और उससे ऊपर के वर्जन में शामिल है। यह रेट लिमिटिंग की विभिन्न रणनीतियों के लिए एब्स्ट्रैक्शन और इम्प्लीमेंटेशन प्रदान करती है। मुख्य क्लास RateLimiter है, जो दिए गए नियमों के आधार पर रिसोर्स तक एक्सेस को मैनेज करती है और रिक्वेस्ट को अनुमति या अस्वीकार करती है।

मुख्य अवधारणाएँ

  • RateLimiter — बेस क्लास, जिससे सभी इम्प्लीमेंटेशन इनहेरिट होते हैं।
  • Acquire / TryAcquire — परमिशन लेने के लिए सिंक्रोनस मेथड।
  • AcquireAsync / WaitAsync — एसिंक्रोनस मेथड, जो लिमिट रिलीज़ होने का इंतज़ार कर सकते हैं।
  • Metadata — लिमिट के बारे में अतिरिक्त जानकारी (जैसे, रीसेट होने का समय)।

बिल्ट-इन Rate Limiting रणनीतियाँ

यह लाइब्रेरी चार मुख्य रणनीतियाँ सपोर्ट करती है:

1. फिक्स्ड विंडो (Fixed Window)

रिक्वेस्ट को एक निश्चित समय अवधि (विंडो) में ग्रुप किया जाता है। यदि लिमिट पार हो जाती है, तो अगली विंडो शुरू होने तक रिक्वेस्ट अस्वीकार कर दी जाती हैं।

using System.Threading.RateLimiting;

var options = new FixedWindowRateLimiterOptions
{
    PermitLimit = 10,
    Window = TimeSpan.FromSeconds(1),
    QueueProcessingOrder = QueueProcessingOrder.OldestFirst,
    QueueLimit = 0
};

var limiter = new FixedWindowRateLimiter(options);

for (int i = 0; i < 15; i++)
{
    using var lease = await limiter.AcquireAsync();
    if (lease.IsAcquired)
    {
        Console.WriteLine($"रिक्वेस्ट {i} स्वीकृत");
    }
    else
    {
        Console.WriteLine($"रिक्वेस्ट {i} अस्वीकृत");
    }
}

2. स्लाइडिंग विंडो (Sliding Window)

फिक्स्ड विंडो के समान, लेकिन विंडो हर रिक्वेस्ट के साथ "स्लाइड" होती है, जिससे अधिक स्मूथ लिमिटिंग मिलती है। इसे सेगमेंट में बांटा जाता है।

var slidingOptions = new SlidingWindowRateLimiterOptions
{
    PermitLimit = 10,
    Window = TimeSpan.FromSeconds(1),
    SegmentsPerWindow = 4,
    QueueLimit = 0
};

var slidingLimiter = new SlidingWindowRateLimiter(slidingOptions);

3. टोकन बकेट (Token Bucket)

सबसे लोकप्रिय एल्गोरिदम में से एक। बकेट में एक निश्चित संख्या में "टोकन" होते हैं। टोकन एक निश्चित दर से जोड़े जाते हैं। हर रिक्वेस्ट एक या अधिक टोकन का उपभोग करती है। यदि बकेट खाली है, तो रिक्वेस्ट इंतज़ार करती है या अस्वीकार कर दी जाती है।

var tokenOptions = new TokenBucketRateLimiterOptions
{
    TokenLimit = 100,
    QueueLimit = 0,
    ReplenishmentPeriod = TimeSpan.FromSeconds(1),
    TokensPerPeriod = 10,
    AutoReplenishment = true
};

var tokenLimiter = new TokenBucketRateLimiter(tokenOptions);

4. कंकरेंसी लिमिटर (Concurrency Limiter)

एक साथ चलने वाली रिक्वेस्ट की संख्या को सीमित करता है। यह स्पीड के बजाय पैरेललिज़्म को मैनेज करने के लिए उपयोगी है।

var concurrencyOptions = new ConcurrencyLimiterOptions
{
    PermitLimit = 5,
    QueueLimit = 10
};

var concurrencyLimiter = new ConcurrencyLimiter(concurrencyOptions);

ASP.NET Core में RateLimiter का उपयोग

.NET 7 से शुरू करके, रेट लिमिटिंग को ASP.NET Core मिडलवेयर में आसानी से इंटीग्रेट किया जा सकता है। सर्विसेज रजिस्टर करना और पॉलिसी कॉन्फ़िगर करना:

// Program.cs
builder.Services.AddRateLimiter(options =>
{
    options.AddFixedWindowLimiter("Fixed", config =                    

अनुशंसाएँ