C# (.NET) में रेट लिमिटिंग: System.Threading.RateLimiting लाइब्रेरी
रेट लिमिटिंग (अनुरोधों की गति को सीमित करना) — API, माइक्रोसर्विसेज और वेब एप्लिकेशन को ओवरलोड, DDoS हमलों और अनियंत्रित संसाधन खपत से बचाने के लिए एक महत्वपूर्ण तंत्र है। .NET 7 से शुरू होकर, .NET इकोसिस्टम में एक अंतर्निहित लाइब्रेरी System.Threading.RateLimiting शामिल है, जो विभिन्न सीमा रणनीतियों को लागू करने के लिए लचीले और कुशल उपकरण प्रदान करती है।
रेट लिमिटिंग क्या है और इसकी आवश्यकता क्यों है?
रेट लिमिटिंग आपको एक निश्चित समय अवधि में संचालन (अनुरोध, विधि कॉल, लेन-देन) की संख्या को नियंत्रित करने की अनुमति देता है। मुख्य उपयोग परिदृश्य:
- सार्वजनिक API की सुरक्षा — क्लाइंट द्वारा दुरुपयोग को रोकना।
- बैकएंड को स्थिर करना — डेटाबेस और बाहरी सेवाओं पर लोड का समान वितरण।
- संसाधनों की बचत — भुगतान वाले तृतीय-पक्ष API के कॉल को सीमित करना।
- SLA सुनिश्चित करना — सभी उपयोगकर्ताओं के लिए समान पहुंच की गारंटी।
System.Threading.RateLimiting लाइब्रेरी के मुख्य घटक
लाइब्रेरी अमूर्त वर्ग RateLimiter और कई तैयार कार्यान्वयनों के आसपास बनाई गई है:
1. TokenBucketRateLimiter (टोकन बकेट एल्गोरिदम)
क्लासिक एल्गोरिदम जो एक निर्धारित दर (replenishment rate) पर टोकन जमा करता है और आवश्यकतानुसार उनका उपयोग करने की अनुमति देता है। पीक लोड को सुचारू करने के लिए उपयुक्त।
using System.Threading.RateLimiting;
var limiter = new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions{ TokenLimit = 100, // अधिकतम टोकन संख्या TokensPerPeriod = 20, // प्रति अवधि में कितने टोकन जोड़े जाते हैं ReplenishmentPeriod = TimeSpan.FromSeconds(1), // पुनःपूर्ति अवधि QueueLimit = 10, // प्रतीक्षा कतार का अधिकतम आकार QueueProcessingOrder = QueueProcessingOrder.OldestFirst});
// उपयोग का उदाहरणusing var lease = await limiter.AcquireAsync(cancellationToken: CancellationToken.None);if (lease.IsAcquired){ // संचालन निष्पादित करें Console.WriteLine("टोकन प्राप्त हुआ");}else{ // अस्वीकृति को संभालें Console.WriteLine("सीमा पार हो गई, बाद में प्रयास करें");}2. ConcurrencyLimiter (समवर्तीता सीमा)
एक साथ होने वाले संचालन की संख्या को सीमित करता है। सीमित संसाधनों (कनेक्शन पूल, फ़ाइल डिस्क्रिप्टर) तक पहुंच को नियंत्रित करने के लिए आदर्श।
var concurrencyLimiter = new ConcurrencyLimiter(new ConcurrencyLimiterOptions{ PermitLimit = 10, // अधिकतम 10 समवर्ती अनुरोध QueueLimit = 5, // अधिकतम 5 अनुरोधों की प्रतीक्षा कतार QueueProcessingOrder = QueueProcessingOrder.NewestFirst});
// एसिंक्रोनस संदर्भ में उपयोगasync Task ProcessRequestAsync(){ using var lease = await concurrencyLimiter.AcquireAsync(); if (lease.IsAcquired) { // संसाधन-गहन कार्य निष्पादित करें await Task.Delay(1000); }}3. FixedWindowRateLimiter (निश्चित विंडो)
सबसे सरल एल्गोरिदम: एक निश्चित समय अंतराल में N संचालन की अनुमति देता है (जैसे, प्रति मिनट 100 अनुरोध)। विंडो समाप्त होने पर काउंटर रीसेट हो जाता है।
var fixedWindow = new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions{ PermitLimit = 60, // 60 अनुरोध Window = TimeSpan.FromMinutes(1), // 1 मिनट में QueueLimit = 0, // बिना कतार के AutoReplenishment = true // स्वचालित विंडो रीसेट});
// सीमा की जाँचRateLimitLease lease = fixedWindow.AttemptAcquire();if (lease.IsAcquired){ Console.WriteLine($"शेष प्रयास: {lease.GetAllMetadata()}");}4. SlidingWindowRateLimiter (स्लाइडिंग विंडो)
बोल