TypeScript में Rate Limiting: लाइब्रेरी और इम्प्लीमेंटेशन की पूरी गाइड
Rate Limiting (रिक्वेस्ट स्पीड को सीमित करना) एक ट्रैफिक कंट्रोल मैकेनिज्म है जो सर्वर को ओवरलोड होने से बचाता है, DDoS अटैक से सुरक्षा प्रदान करता है, और संसाधनों का समान वितरण सुनिश्चित करता है। TypeScript में, स्ट्रॉन्ग टाइपिंग और एसिंक्रोनस सपोर्ट के कारण, rate limiting को लागू करना बेहद आसान हो जाता है। इस लेख में हम लोकप्रिय लाइब्रेरी, रणनीतियाँ और TypeScript कोड उदाहरण देखेंगे।
Rate Limiting की आवश्यकता क्यों है?
- API सुरक्षा — एक क्लाइंट (IP, टोकन या ID के आधार पर) से रिक्वेस्ट की संख्या सीमित करना।
- दुरुपयोग रोकना — बॉट या स्क्रिप्ट को ब्लॉक करना जो अत्यधिक लोड उत्पन्न करते हैं।
- संसाधनों का वितरण — यूज़र्स के बीच बैकएंड का उचित उपयोग सुनिश्चित करना।
- बाहरी सेवाओं की सीमाओं का पालन — तीसरे पक्ष के API (जैसे OpenAI या GitHub) पर रिक्वेस्ट को नियंत्रित करना।
TypeScript के लिए लोकप्रिय Rate Limiting लाइब्रेरी
1. express-rate-limit
Express.js के लिए सबसे लोकप्रिय लाइब्रेरी। यह middleware के रूप में काम करती है और TypeScript को आउट-ऑफ-द-बॉक्स सपोर्ट करती है। आप समय सीमा और कस्टम हैंडलर सेट कर सकते हैं।
इंस्टॉलेशन:
npm install express-rate-limit
npm install -D @types/express-rate-limit
उपयोग का उदाहरण:
import express from 'express';
import rateLimit from 'express-rate-limit';
const app = express();
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 मिनट
max: 100, // प्रति विंडो अधिकतम 100 रिक्वेस्ट
message: 'बहुत अधिक रिक्वेस्ट, कृपया बाद में प्रयास करें।',
standardHeaders: true,
legacyHeaders: false,
});
app.use('/api', limiter); // /api/* पर लागू करें
app.get('/api/data', (req, res) => {
res.json({ message: 'सफल प्रतिक्रिया' });
});
app.listen(3000);
विशेषताएँ:
- TypeScript के लिए बिल्ट-इन सपोर्ट (
RequestऔरResponseके लिए टाइप्स)। - लचीला कॉन्फ़िगरेशन: की (IP, userId, टोकन) सेट कर सकते हैं।
- मेमोरी (डिफ़ॉल्ट) या Redis के माध्यम से स्टेट स्टोरेज।
2. bottleneck
क्लाइंट-साइड rate limiting के लिए लाइब्रेरी — बाहरी API पर आउटगोइंग रिक्वेस्ट को नियंत्रित करने के लिए आदर्श। यह क्यू और डिले पर आधारित काम करती है।
इंस्टॉलेशन:
npm install bottleneck
TypeScript के साथ उदाहरण:
import Bottleneck from 'bottleneck';
const limiter = new Bottleneck({
minTime: 200, // रिक्वेस्ट के बीच न्यूनतम 200 ms
maxConcurrent: 5, // अधिकतम 5 समवर्ती रिक्वेस्ट
reservoir: 100, // अवधि के लिए कुल सीमा
reservoirRefreshAmount: 100,
reservoirRefreshInterval: 60 * 1000, // हर 60 सेकंड
});
async function fetchData(id: number): Promise<string> {
const response = await fetch(`https://api.example.com/data/${id}`);
return response.text();
}
// फंक्शन को लिमिटिंग के साथ रैप करें
const limitedFetch = limiter.wrap(fetchData);
// उपयोग
async function main() {
const results = await Promise.all([
limitedFetch(1),
limitedFetch(2),
limitedFetch(3),
]);
console.log(results);
}
लाभ:
- रैप किए गए फंक्शन के लिए टाइप सपोर्ट।
- लचीली रणनीतियाँ:
minTime,maxConcurrent,reservoir। - Node.js और ब्राउज़र दोनों में काम करती है।
3. p-limit
समवर्ती एसिंक्रोनस ऑपरेशंस को सीमित करने के लिए हल्की लाइब्रेरी। यह एक साथ चलने वाले प्रॉमिस की संख्या को नियंत्रित करने में मददगार है।
इंस्टॉलेशन:
npm install p-limit
उदाहरण:
import pLimit from 'p-limit';