मेमोरी-आधारित दर-सीमाकर्ता का डिज़ाइन
सामान्य प्रोग्रामिंग पैटर्न का उपयोग करके एकल-इंस्टेंस अनुप्रयोगों के लिए उपयुक्त बुनियादी मेमोरी-आधारित दर-सीमाकर्ता का डिज़ाइन और कार्यान्वयन करें।
मेमोरी-आधारित दर-सीमाकर्ता का डिज़ाइन, CoddyKit पर एपीआई दर-सीमा निर्धारण और स्केलेबिलिटी पैटर्न का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह एपीआई दर-सीमा निर्धारण और स्केलेबिलिटी पैटर्न सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। एपीआई दर-सीमा निर्धारण और स्केलेबिलिटी पैटर्न पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
इन-मेमोरी सीमा का परिचय
इन-मेमोरी दर-सीमक का डिज़ाइन सीखने में आपका स्वागत है! यह सबसे सरल प्रकार का दर-सीमक है और मूल अवधारणाओं को समझने के लिए उत्तम है।
एक इन-मेमोरी दर-सीमक अपने सभी निगरानी डेटा (जैसे किसी उपयोगकर्ता ने कितने अनुरोध किए हैं) को अलग डेटाबेस या सेवा में नहीं, बल्कि सीधे अनुप्रयोग की RAM में संग्रहीत करता है।
इससे इसे तेज़ी से और आसानी से स्थापित किया जा सकता है, लेकिन इसकी कुछ विशेष सीमाएँ भी हैं, जिन्हें हम समझेंगे।
इन-मेमोरी का उपयोग क्यों करें
इन-मेमोरी दर-सीमक इन स्थितियों के लिए आदर्श हैं:
- एकल-इंस्टेंस अनुप्रयोग: जहाँ आपका अनुप्रयोग केवल एक सर्वर पर चलता है।
- त्वरित प्रारूप: जटिल आधारभूत संरचना के बिना दर-सीमा अवधारणाओं का परीक्षण करने के लिए।
- गैर-महत्वपूर्ण API: जहाँ सर्वर पुनः आरंभ होने के कारण कभी-कभार अनुरोध छूट जाना स्वीकार्य हो।
इन्हें लागू करना सरल है, क्योंकि इन्हें बाहरी डेटा संग्रहों से संपर्क करने की आवश्यकता नहीं होती।
मुख्य डिज़ाइन अवधारणाएँ
हर दर-सीमक को कुछ प्रमुख जानकारी का ध्यान रखना पड़ता है:
- क्लाइंट ID: अनुरोध कौन कर रहा है? (जैसे, IP पता, उपयोगकर्ता ID, API कुंजी)
- अनुरोध सीमा: कितने अनुरोधों की अनुमति है? (जैसे, 100 अनुरोध)
- समय-विंडो: किस अवधि के लिए? (जैसे, प्रति मिनट या प्रति घंटे)
हमारा इन-मेमोरी डिज़ाइन इन अवधारणाओं का उपयोग करके तय करेगा कि किसी अनुरोध की अनुमति देनी है या उसे अस्वीकार करना है।
रणनीति चुनना: निश्चित विंडो
अपने मूल इन-मेमोरी दर-सीमक के लिए हम निश्चित विंडो काउंटर एल्गोरिदम का उपयोग करेंगे। यह सीधा है:
- अनुरोधों की गणना एक निश्चित समय-विंडो के भीतर की जाती है (जैसे, 0–59 सेकंड, 60–119 सेकंड)।
- नई विंडो शुरू होने पर काउंटर शून्य पर रीसेट हो जाता है।
- यदि वर्तमान विंडो में अनुरोधों की संख्या सीमा से अधिक हो जाती है, तो नए अनुरोध अस्वीकार कर दिए जाते हैं।
सरल होने के बावजूद, यह दर-सीमा की कार्यप्रणाली समझने के लिए एक बेहतरीन शुरुआत है।
निगरानी के लिए डेटा संरचनाएँ
अलग-अलग क्लाइंट की समय-विंडो में अनुरोधों का ध्यान रखने के लिए हम Java के ConcurrentHashMap का उपयोग करेंगे:
counts: प्रत्येकclientIdके अनुरोधों की संख्या संग्रहीत करने वाला मानचित्र (जैसे,"user1" -> 5)।windowStarts: प्रत्येकclientIdकी वर्तमान विंडो का प्रारंभ समय संग्रहीत करने वाला मानचित्र (जैसे,"user1" -> 1678886400000L)।
ConcurrentHashMap थ्रेड-सुरक्षित है, जो तब महत्वपूर्ण होता है जब एक ही समय में कई अनुरोध हमारे दर-सीमक तक पहुँच सकते हैं।
दर-सीमक क्लास बनाना
आइए अपनी InMemoryRateLimiter क्लास को परिभाषित करके शुरू करें। इसमें हमारा कॉन्फ़िगरेशन (सीमा और विंडो की अवधि) तथा निगरानी के लिए मानचित्र होंगे।
मूल संरचना इस प्रकार है:
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class InMemoryRateLimiter {
private final int limit; // Max requests allowed
private final long windowMillis; // Time window in milliseconds
private final ConcurrentHashMap<String, AtomicInteger> counts = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, Long> windowStarts = new ConcurrentHashMap<>();
public InMemoryRateLimiter(int limit, long windowMillis) {
this.limit = limit;
this.windowMillis = windowMillis;
}
// The allowRequest method will go here
}`allowRequest` लागू करना - भाग 1
हमारे दर-सीमक का मुख्य भाग allowRequest(String clientId) मेथड है। यह मेथड तय करेगा कि दिए गए क्लाइंट के अनुरोध की अनुमति दी जानी चाहिए या नहीं।
सबसे पहले, हम वर्तमान समय प्राप्त करते हैं और क्लाइंट के पहले अनुरोध पर उसकी विंडो का प्रारंभ समय निर्धारित करते हैं:
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class InMemoryRateLimiter {
private final int limit;
private final long windowMillis;
private final ConcurrentHashMap<String, AtomicInteger> counts = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, Long> windowStarts = new ConcurrentHashMap<>();
public InMemoryRateLimiter(int limit, long windowMillis) {
this.limit = limit;
this.windowMillis = windowMillis;
}
public boolean allowRequest(String clientId) {
long currentTime = System.currentTimeMillis();
// Get or initialize window start time for this client
long currentWindowStart = windowStarts.computeIfAbsent(clientId, k -> currentTime);
// ... more logic to come ...
return false; // Placeholder
}
}`allowRequest` लागू करना - भाग 2
इसके बाद, हम यह जाँचने का लॉजिक जोड़ते हैं कि वर्तमान समय-विंडो समाप्त हो चुकी है या नहीं। यदि समाप्त हो गई है, तो हम उस क्लाइंट के लिए विंडो का प्रारंभ समय और अनुरोधों की संख्या रीसेट कर देते हैं।
इससे यह सुनिश्चित होता है कि नई विंडो शुरू होने पर क्लाइंट को अनुरोधों का नया कोटा मिले।
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class InMemoryRateLimiter {
private final int limit;
private final long windowMillis;
private final ConcurrentHashMap<String, AtomicInteger> counts = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, Long> windowStarts = new ConcurrentHashMap<>();
public InMemoryRateLimiter(int limit, long windowMillis) {
this.limit = limit;
this.windowMillis = windowMillis;
}
public boolean allowRequest(String clientId) {
long currentTime = System.currentTimeMillis();
long currentWindowStart = windowStarts.computeIfAbsent(clientId, k -> currentTime);
// If the current window has expired, reset it
if (currentTime - currentWindowStart >= windowMillis) {
windowStarts.put(clientId, currentTime); // Start a new window
counts.put(clientId, new AtomicInteger(0)); // Reset count
}
// ... more logic to come ...
return false; // Placeholder
}
}`allowRequest` लागू करना - भाग 3
अंत में, हम क्लाइंट की अनुरोध संख्या बढ़ाते हैं और जाँचते हैं कि वह अभी भी अनुमत सीमा के भीतर है या नहीं। यदि है, तो अनुरोध की अनुमति दी जाती है; अन्यथा, उसे अस्वीकार कर दिया जाता है।
AtomicInteger थ्रेड-सुरक्षित तरीके से संख्या बढ़ाना सुनिश्चित करता है।
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class InMemoryRateLimiter {
private final int limit;
private final long windowMillis;
private final ConcurrentHashMap<String, AtomicInteger> counts = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, Long> windowStarts = new ConcurrentHashMap<>();
public InMemoryRateLimiter(int limit, long windowMillis) {
this.limit = limit;
this.windowMillis = windowMillis;
}
public boolean allowRequest(String clientId) {
long currentTime = System.currentTimeMillis();
long currentWindowStart = windowStarts.computeIfAbsent(clientId, k -> currentTime);
if (currentTime - currentWindowStart >= windowMillis) {
windowStarts.put(clientId, currentTime);
counts.put(clientId, new AtomicInteger(0));
}
// Increment count and check if within limit
AtomicInteger clientCount = counts.computeIfAbsent(clientId, k -> new AtomicInteger(0));
if (clientCount.incrementAndGet() <= limit) {
return true; // Request allowed
} else {
return false; // Request denied
}
}
public static void main(String[] args) {
// Example usage will go here
}
}पूरा उदाहरण और परीक्षण
आइए सब कुछ एक साथ जोड़कर अपने इन-मेमोरी दर-सीमक का परीक्षण करें! यह उदाहरण किसी विशिष्ट उपयोगकर्ता के लिए हर 5 सेकंड में 3 अनुरोधों की अनुमति देने वाला दर-सीमक बनाता है।
कोड चलाएँ और देखें कि शुरुआत में अनुरोधों की अनुमति मिलती है, फिर वे अस्वीकार होते हैं, और अंततः समय-विंडो रीसेट होने के बाद फिर से अनुमति मिलने लगती है।
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class InMemoryRateLimiter {
private final int limit;
private final long windowMillis;
private final ConcurrentHashMap<String, AtomicInteger> counts = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, Long> windowStarts = new ConcurrentHashMap<>();
public InMemoryRateLimiter(int limit, long windowMillis) {
this.limit = limit;
this.windowMillis = windowMillis;
}
public boolean allowRequest(String clientId) {
long currentTime = System.currentTimeMillis();
long currentWindowStart = windowStarts.computeIfAbsent(clientId, k -> currentTime);
if (currentTime - currentWindowStart >= windowMillis) {
windowStarts.put(clientId, currentTime);
counts.put(clientId, new AtomicInteger(0));
}
AtomicInteger clientCount = counts.computeIfAbsent(clientId, k -> new AtomicInteger(0));
if (clientCount.incrementAndGet() <= limit) {
return true;
} else {
return false;
}
}
public static void main(String[] args) throws InterruptedException {
// Allow 3 requests per 5 seconds for "user1"
InMemoryRateLimiter limiter = new InMemoryRateLimiter(3, 5000);
String user = "user1";
System.out.println("Testing rate limiter for " + user + ": 3 requests / 5 seconds\n");
for (int i = 0; i < 5; i++) {
boolean allowed = limiter.allowRequest(user);
System.out.println("Request " + (i + 1) + ": " + (allowed ? "Allowed" : "Denied"));
if (i == 2) { // After 3rd request, wait for window to reset
System.out.println("\n--- Max requests reached. Waiting for window reset (5.5s) ---\n");
Thread.sleep(5500); // Wait for window to reset
}
}
System.out.println("\n--- Testing after window reset ---\n");
for (int i = 0; i < 2; i++) {
boolean allowed = limiter.allowRequest(user);
System.out.println("Request " + (i + 1) + ": " + (allowed ? "Allowed" : "Denied"));
}
}
}इन-मेमोरी सीमाओं को समझना
हालाँकि सरल और तेज़ होते हैं, मेमोरी-आधारित दर सीमक की एक गंभीर सीमा होती है। कल्पना कीजिए कि अधिक ट्रैफ़िक संभालने के लिए आप अपना अनुप्रयोग कई सर्वरों पर तैनात करते हैं।
यदि एक ही उपयोगकर्ता के अनुरोध अलग-अलग सर्वरों पर जाएँ, तो क्या होगा?
पुनरावलोकन: मेमोरी-आधारित दर सीमित करना
आपने सफलतापूर्वक एक बुनियादी मेमोरी-आधारित दर सीमक तैयार और समझ लिया है!
- हमने मेमोरी-आधारित दर सीमक और एकल-इंस्टेंस अनुप्रयोगों में इसके उपयोग के मामलों को परिभाषित किया।
- हमने मुख्य अवधारणाओं का अध्ययन किया: क्लाइंट ID, सीमा और समय विंडो।
- हमने Java में
ConcurrentHashMapका उपयोग करके निश्चित विंडो काउंटर लागू किया। - अब आप इसकी मुख्य सीमा समझते हैं: साझा स्थिति न होने के कारण यह वितरित प्रणालियों के लिए उपयुक्त नहीं है।
अधिक उन्नत, वितरित दर-सीमित समाधानों को समझने से पहले यह आधारभूत ज्ञान अत्यंत महत्वपूर्ण है!
एआई शिक्षक के साथ एपीआई दर-सीमा निर्धारण और स्केलेबिलिटी पैटर्न सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 12
- पाठ
- 48
अक्सर पूछे जाने वाले प्रश्न
क्या “मेमोरी-आधारित दर-सीमाकर्ता का डिज़ाइन” पाठ निःशुल्क है?
हाँ—“मेमोरी-आधारित दर-सीमाकर्ता का डिज़ाइन” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और एपीआई दर-सीमा निर्धारण और स्केलेबिलिटी पैटर्न पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। एपीआई दर-सीमा निर्धारण और स्केलेबिलिटी पैटर्न पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“मेमोरी-आधारित दर-सीमाकर्ता का डिज़ाइन” में मैं क्या सीखूँगा?
सामान्य प्रोग्रामिंग पैटर्न का उपयोग करके एकल-इंस्टेंस अनुप्रयोगों के लिए उपयुक्त बुनियादी मेमोरी-आधारित दर-सीमाकर्ता का डिज़ाइन और कार्यान्वयन करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ एपीआई दर-सीमा निर्धारण और स्केलेबिलिटी पैटर्न का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या एपीआई दर-सीमा निर्धारण और स्केलेबिलिटी पैटर्न शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर एपीआई दर-सीमा निर्धारण और स्केलेबिलिटी पैटर्न शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“मेमोरी-आधारित दर-सीमाकर्ता का डिज़ाइन” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस एपीआई दर-सीमा निर्धारण और स्केलेबिलिटी पैटर्न पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर एपीआई दर-सीमा निर्धारण और स्केलेबिलिटी पैटर्न पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- मेमोरी-आधारित दर-सीमाकर्ता का डिज़ाइन
- Redis के साथ वितरित दर-सीमा
- दर-सीमा पार होने से निपटना
- अपने रेट लिमिटर का परीक्षण और निगरानी