जावास्क्रिप्ट में रेट लिमिटिंग और थ्रॉटलिंग: सुरक्षा और प्रदर्शन
\n\nक्या आपने कभी सोचा है कि "सबमिट" बटन पर कुछ तेज़ क्लिक करने के बाद आपकी पसंदीदा सेवा अचानक जवाब देना क्यों बंद कर देती है? या कुछ वेबसाइटें फॉर्म दोबारा भेजने से पहले "30 सेकंड प्रतीक्षा करने" के लिए क्यों कहती हैं? इसका उत्तर दो शक्तिशाली तंत्रों में छिपा है जो बैकएंड को ओवरलोड से और उपयोगकर्ताओं को "बग्स" से बचाते हैं: रेट लिमिटिंग और थ्रॉटलिंग।
\n\nइस लेख में, हम जानेंगे कि शुद्ध जावास्क्रिप्ट और Node.js पर इन तकनीकों को कैसे लागू किया जाए। आप जानेंगे कि थ्रॉटल डिबाउंस से कैसे अलग है, API के लिए एक सरल रेट लिमिटर कैसे लिखें, और आपकी साइट तेज़ क्यों चलेगी। चलिए शुरू करते हैं!
\n\nरेट लिमिटिंग क्या है और इसकी आवश्यकता क्यों है?
\n\nरेट लिमिटिंग (अनुरोध दर सीमित करना) एक सुरक्षात्मक तंत्र है जो एक निश्चित समय अवधि में क्लाइंट (या IP पते) से अनुरोधों की संख्या को सीमित करता है। इसे एक बैरियर की तरह समझें: एक कार गुजर सकती है, लेकिन हर 10 सेकंड में केवल एक बार।
\n\nइसका उपयोग कहाँ किया जाता है?
\n- \n
- API को DDoS हमलों और स्पैम से बचाना। \n
- बड़े पैमाने पर अनुरोधों के दौरान सर्वर ओवरलोड को रोकना। \n
- भुगतान वाले API में संसाधन उपयोग को नियंत्रित करना (जैसे, प्रति घंटे 100 अनुरोध)। \n
- क्लाइंट पर "अनंत लूप" त्रुटियों से बचाव। \n
थ्रॉटलिंग के विपरीत, जो अनुरोधों के प्रवाह को सुचारू करता है, रेट लिमिटिंग एक कठोर दीवार है: "रुको, तुमने सीमा पार कर ली है"।
\n\nथ्रॉटलिंग बनाम डिबाउंस: मुख्य अंतर
\n\nअक्सर थ्रॉटलिंग और डिबाउंस को भ्रमित किया जाता है। आइए इसे स्पष्ट करते हैं।
\n\n- \n
- थ्रॉटल — यह सुनिश्चित करता है कि फ़ंक्शन को N मिलीसेकंड में एक बार से अधिक नहीं बुलाया जाएगा। इसे पानी के नल की तरह समझें: आप इसे खोलते हैं, और पानी एक स्थिर गति से बहता है, भले ही आप हैंडल को तेज़ी से हिलाएं। \n
- डिबाउंस — अंतिम घटना के बाद N मिलीसेकंड बीत जाने तक फ़ंक्शन कॉल को विलंबित करता है। ऑटो-कम्प्लीट सर्च के लिए आदर्श: जब तक उपयोगकर्ता टाइप कर रहा है, अनुरोध नहीं भेजा जाता। \n
रेट लिमिटिंग के संदर्भ में, हम विशेष रूप से थ्रॉटल में रुचि रखते हैं — हम आवृत्ति को नियंत्रित करना चाहते हैं, अनुरोधों में देरी नहीं करना चाहते।
\n\nजावास्क्रिप्ट में सबसे सरल रेट लिमिटर
\n\nआइए Node.js पर अपना स्वयं का रेट लिमिटर लिखें। यह प्रत्येक उपयोगकर्ता से अंतिम अनुरोध का समय याद रखेगा और बहुत बार-बार होने वाली कॉल को ब्लॉक करेगा।
\n\nclass RateLimiter {\n constructor(limit, windowMs) {\n this.limit = limit; // अधिकतम अनुरोध\n this.windowMs = windowMs; // मिलीसेकंड में समय विंडो\n this.requests = new Map(); // स्टोरेज: userId -> [timestamps]\n }\n\n allow(userId) {\n const now = Date.now();\n const userRequests = this.requests.get(userId) || [];\n \n // पुरानी प्रविष्टियाँ हटाएं\n const recentRequests = userRequests.filter(\n ts => now - ts < this.windowMs\n );\n \n if (recentRequests.length >= this.limit) {\n console.log(`रेट लिमिट पार हो गया ${userId} के लिए`);\n return false;\n }\n \n recentRequests.push(now);\n this.requests.set(userId, recentRequests);\n return true;\n }\n}\n\n// उपयोग\nconst limiter = new RateLimiter(5, 60000); // प्रति मिनट 5 अनुरोध\n\n// अनुरोधों का अनुकरण\nfor (let i = 0; i < 10; i++) {\n setTimeout(() => {\n const allowed = limiter.allow('user123');\n console.log(`अनुरोध ${i+1}: ${allowed ? '✅ अनुमति' : '❌ अवरुद्ध'}`);\n }, i * 2000); // हर 2 सेकंड\n}\n\nयह कोड शैक्षिक उद्देश्यों के लिए एकदम सही है, लेकिन प्रोडक्शन में तैयार समाधानों का उपयोग करना बेहतर है (जैसे, Express के लिए express-rate-limit या rate-limiter-flexible)।
क्लाइंट पर थ्रॉटलिंग: तेज़ क्लिक से सुरक्षा
\n\nअक्सर समस्या क्लाइंट साइड पर उत्पन्न होती है: उपयोगकर्ता "सबमिट" बटन को कई बार दबाता है, और अनुरोध समानांतर में भेजे जाते हैं। आर