अपने API को रिक्वेस्ट के तूफान से कैसे बचाएं
\n\nसोचिए: आपने एक शानदार सर्विस बनाई, TypeScript में बैकएंड लिखा, और अचानक एक "दयालु" यूज़र एक स्क्रिप्ट चला देता है जो आपके एंडपॉइंट पर हजारों रिक्वेस्ट प्रति सेकंड भेजता है। सर्वर क्रैश, डेटाबेस हैंग, और असली यूज़र्स को 502 एरर दिखती है। परिचित लग रहा है?
\n\nवेब डेवलपमेंट की दुनिया में rate limiting (रिक्वेस्ट फ्रीक्वेंसी सीमित करना) और throttling (थ्रॉटलिंग) सिर्फ फैंसी शब्द नहीं हैं, बल्कि आपके API के लिए लाइफलाइन हैं। आज हम देखेंगे कि TypeScript में इन मैकेनिज़्म को बिना सिरदर्द के कैसे लागू करें। चलिए शुरू करते हैं!
\n\nRate Limiting vs Throttling: क्या अंतर है?
\n\nकोड लिखने से पहले, इन दोनों कॉन्सेप्ट को स्पष्ट रूप से समझ लेते हैं। कई लोग इन्हें मिलाते हैं, लेकिन अंतर बहुत महत्वपूर्ण है।
\n\n- \n
- Rate limiting — एक सख्त सीमा: "एक IP से प्रति मिनट 100 से ज्यादा रिक्वेस्ट नहीं।" सीमा पार की? 429 Too Many Requests एरर और विंडो खत्म होने तक ब्लॉक। यह API गेटवे लेवल पर काम करता है। \n
- Throttling — एक स्मूथ नियंत्रण: "आप रिक्वेस्ट कर सकते हैं, लेकिन एक सेकंड में एक से ज्यादा नहीं।" बाकी रिक्वेस्ट या तो कतार में लग जाती हैं या इग्नोर हो जाती हैं, लेकिन यूज़र ब्लॉक नहीं होता। \n
एक आसान उदाहरण: rate limiting मेट्रो का टर्नस्टाइल है (कार्ड लगाया? अंदर जाओ। नहीं? रुको), जबकि throttling चौराहे पर ट्रैफिक पुलिस है (गाड़ियां चलती हैं, लेकिन एक अंतराल पर)।
\n\nइसकी जरूरत कब पड़ती है? असली उपयोग के मामले
\n\nआप कहेंगे: "मेरी छोटी सी वेबसाइट है, मुझे इसकी क्या जरूरत?" तो ये रही जरूरत:
\n\n- \n
- DDoS और ब्रूटफोर्स से सुरक्षा — हैकर्स पासवर्ड नहीं तोड़ पाएंगे या सर्वर को क्रैश नहीं कर पाएंगे। \n
- संसाधनों की बचत — पेड API (जैसे OpenAI) हर कॉल पर पैसे लेते हैं। क्लाइंट को सीमित करके आप बजट बचा सकते हैं। \n
- लोड का उचित वितरण — एक "शोर मचाने वाला" यूज़र बाकी सभी को प्रभावित नहीं करेगा। \n
- SLA का पालन — अगर आप 99.9% अपटाइम का वादा करते हैं, तो बिना सीमाओं के काम नहीं चलेगा। \n
TypeScript में Rate Limiting लिखना: आसान शुरुआत
\n\nचलिए एक बेसिक उदाहरण से शुरू करते हैं — in-memory rate limiter जो Fixed Window पर आधारित है। यह रिक्वेस्ट काउंट को सीधे एप्लिकेशन की मेमोरी में स्टोर करता है।
\n\n// rateLimiter.ts\nimport { Request, Response, NextFunction } from 'express';\n\ninterface RateLimitEntry {\n count: number;\n resetTime: number;\n}\n\nclass InMemoryRateLimiter {\n private store: Map<string, RateLimitEntry> = new Map();\n private windowMs: number;\n private maxRequests: number;\n\n constructor(windowMs: number, maxRequests: number) {\n this.windowMs = windowMs;\n this.maxRequests = maxRequests;\n }\n\n public middleware() {\n return (req: Request, res: Response, next: NextFunction): void => {\n const key = req.ip || 'unknown';\n const now = Date.now();\n let entry = this.store.get(key);\n\n if (!entry || now > entry.resetTime) {\n // नई विंडो\n entry = { count: 0, resetTime: now + this.windowMs };\n this.store.set(key, entry);\n }\n\n entry.count++;\n\n if (entry.count > this.maxRequests) {\n res.status(429).json({\n error: 'Too Many Requests',\n retryAfter: Math.ceil((entry.resetTime - now) / 1000)\n });\n return;\n }\n\n // हेडर में लिमिट की जानकारी भेजें\n res.setHeader('X-RateLimit-Limit', this.maxRequests);\n res.setHeader('X-RateLimit-Remaining', this.maxRequests - entry.count);\n res.setHeader('X-RateLimit-Reset', Math.ceil(entry.resetTime / 1000));\n\n next();\n };\n }\n\n // पुराने रिकॉर्ड साफ करें (मेमोरी लीक से बचने के लिए)\n public cleanup(): void {