PHP में Rate Limiting और Throttling: रिक्वेस्ट के प्रवाह को नियंत्रित करें
\n\nकल्पना करें: आपने अपनी सेवा के लिए एक शानदार API लॉन्च किया। सब कुछ बढ़िया चल रहा है, जब तक एक "बेकाबू" क्लाइंट आपके सर्वर पर हजारों रिक्वेस्ट प्रति सेकंड भेजना शुरू नहीं कर देता। या, इससे भी बुरा, एक बॉट-पार्सर आपका पूरा डेटाबेस डाउनलोड करने का फैसला करता है। परिचित लग रहा है? अगर नहीं, तो आप भाग्यशाली हैं। लेकिन तैयार रहना बेहतर है। यहीं पर rate limiting और throttling काम आते हैं - दो शूरवीर जो आपके बैकएंड को ओवरलोड से बचाते हैं।
\n\nइस लेख में, हम समझेंगे कि PHP में रिक्वेस्ट को कैसे सीमित करें, वास्तविक कोड उदाहरण देखेंगे, और जानेंगे कि आपके प्रोजेक्ट के लिए कौन सा तरीका सबसे अच्छा है। स्पॉइलर: आपको खुद का सिस्टम बनाने की ज़रूरत नहीं है, लेकिन बुनियादी एल्गोरिदम जानना फायदेमंद है।
\n\nRate Limiting बनाम Throttling: क्या अंतर है?
\n\nअक्सर इन शब्दों का पर्यायवाची रूप में उपयोग किया जाता है, लेकिन इनमें बारीक अंतर है।
\n\n- \n
- Rate Limiting - यह एक सख्त सीमा है। आप कहते हैं: "अधिकतम 100 रिक्वेस्ट प्रति मिनट"। जैसे ही सीमा खत्म होती है, क्लाइंट को HTTP 429 Too Many Requests एरर मिलता है। \n
- Throttling - यह अधिक नरम नियंत्रण है। ब्लॉक करने के बजाय, आप सीमा से अधिक रिक्वेस्ट की प्रोसेसिंग को धीमा कर देते हैं, उन्हें कतार में लगाते हैं या प्राथमिकता कम कर देते हैं। \n
व्यवहार में, PHP में throttling को अक्सर देरी (sleep) या कतारों के माध्यम से लागू किया जाता है, जबकि rate limiting को प्रति यूनिट समय में रिक्वेस्ट की गणना करके। अधिकांश API गेटवे के लिए, दोनों दृष्टिकोणों का संयोजन सबसे अच्छा होता है।
\n\nयह आपके प्रोजेक्ट के लिए क्यों महत्वपूर्ण है?
\n\nPHP में रिक्वेस्ट सीमित करने के कम से कम तीन कारण हैं:
\n\n- \n
- DDoS और बॉट्स से सुरक्षा - एक साधारण स्क्रिप्ट भी सर्वर को क्रैश कर सकती है, अगर कॉल की आवृत्ति को नियंत्रित नहीं किया जाता है। \n
- संसाधनों का उचित वितरण - एक "लालची" क्लाइंट को दूसरे उपयोगकर्ताओं को सेवा से वंचित नहीं करना चाहिए। \n
- स्थिरता और पूर्वानुमान - आप जानते हैं कि किस पीक लोड की उम्मीद करनी है, और आप इन्फ्रास्ट्रक्चर को सही ढंग से कॉन्फ़िगर कर सकते हैं। \n
Rate Limiting एल्गोरिदम: रणनीति चुनें
\n\nकोड लिखने से पहले, आइए तीन लोकप्रिय एल्गोरिदम को समझें। प्रत्येक के अपने फायदे और नुकसान हैं।
\n\n1. Fixed Window (फिक्स्ड विंडो)
\nसबसे सरल तरीका। समय को खंडों में बांटें (जैसे, मिनटों में)। याद रखें कि वर्तमान विंडो में कितनी रिक्वेस्ट आई हैं। सीमा पूरी होने पर, अगली विंडो तक ब्लॉक करें।
\n\nनुकसान: विंडो के जंक्शन पर स्पाइक संभव है - क्लाइंट एक मिनट के अंत में 100 रिक्वेस्ट और अगले मिनट की शुरुआत में 100 रिक्वेस्ट भेज सकता है, जो 2 सेकंड में 200 हो जाती हैं।
\n\n2. Sliding Window (स्लाइडिंग विंडो)
\nअधिक सटीक एल्गोरिदम। फिक्स्ड सेगमेंट के बजाय, हम पिछले N सेकंड को देखते हैं। पुरानी रिक्वेस्ट "एक्सपायर" हो जाती हैं और विंडो से बाहर हो जाती हैं। यह सीमाओं पर स्पाइक को खत्म करता है।
\n\n3. Token Bucket (टोकन बकेट)
\nनेटवर्किंग की दुनिया से एक सुंदर एल्गोरिदम। "बाल्टी" में टोकन होते हैं। प्रत्येक रिक्वेस्ट एक टोकन लेती है। टोकन एक निश्चित दर पर रिफिल होते हैं। अगर बाल्टी खाली है, तो रिक्वेस्ट अस्वीकार कर दी जाती है। यह PHP throttling के लिए एकदम सही है, क्योंकि यह छोटे ट्रैफिक स्पाइक की अनुमति देता है।
\n\nव्यावहारिक कार्यान्वयन: सरल से जटिल तक
\n\nअब कोड पर आते हैं। चलिए फाइलों पर आधारित एक बुनियादी उदाहरण से शुरू करते हैं, फिर इंडस्ट्रियल सॉल्यूशंस देखते हैं।
\n\nफाइलों पर बेसिक Rate Limiter (सीखने के लिए)
\n\nयह उदाहरण काउंटर स्टोर करने के लिए फाइलों का उपयोग करता है। प्रोडक्शन के लिए उपयुक्त नहीं है, लेकिन सिद्धांत को अच्छी तरह से दर्शाता है।
\n\n<?php\nclass SimpleRateLimiter {\n private string $storageDir;\n private int $maxRequests;\n private int $windowSeconds;\n\n public function __construct(string $storageDir, int $maxRequests = 100, int $windowSeconds = 60) {\n $this->storageDir = rtrim($storageDir, '/') . '/';\n $this->maxRequests = $maxRequests;\n $this->windowSeconds =