निगनेक्स - अनुरोधों को सीमित करते समय नोडल विकल्प क्या करता है?


11

के साथ nginx HttpLimitReq मॉड्यूल अनुरोध आईपी द्वारा सीमित किया जा सकता है। हालाँकि, मुझे समझ नहीं आ रहा है कि "नोडल" विकल्प क्या करता है।

यदि सीमा फटने की देरी के भीतर अतिरिक्त अनुरोध आवश्यक नहीं हैं, तो आपको नोडेल का उपयोग करना चाहिए

limit_req   zone=one  burst=5  nodelay;

जवाबों:


11

प्रलेखन यहाँ एक व्याख्या यह है कि आप क्या चाहते हैं की तरह लगता है पता करने के लिए है:

निर्देश ज़ोन (ज़ोन) और अनुरोधों के अधिकतम संभावित फटने (फटने) को निर्दिष्ट करता है। यदि दर ज़ोन में उल्लिखित मांगों से अधिक है, तो अनुरोध में देरी हो रही है, ताकि प्रश्नों को एक निश्चित गति से संसाधित किया जा सके

मेरे द्वारा समझे जाने पर, फटने के अनुरोधों में देरी होगी (अधिक समय लें और तब तक प्रतीक्षा करें जब तक उन्हें सेवा नहीं दी जा सकती), nodelayविकल्पों के साथ देरी का उपयोग नहीं किया जाता है और 503 त्रुटि के साथ अतिरिक्त अनुरोधों से इनकार किया जाता है।

यह ब्लॉग पोस्ट ( आर्काइव.ऑर्ग ) अच्छी व्याख्या देता है कि कैसे निगनेक्स पर काम करने की दर सीमित है:

यदि आप मेरी तरह हैं, तो आप शायद सोच रहे हैं कि वास्तव में बिल्ली का क्या मतलब है। यहां यह चाल है: 'फट' शब्द को 'बकेट' से बदलें, और मान लें कि हर उपयोगकर्ता को 5 टोकन के साथ एक बाल्टी दी जाती है। हर बार जब वे प्रति सेकंड 1 अनुरोध की दर से अधिक हो जाते हैं, तो उन्हें एक टोकन का भुगतान करना होगा। एक बार जब वे अपने सभी टोकन खर्च कर चुके होते हैं, तो उन्हें HTTP 503 त्रुटि संदेश दिया जाता है, जो अनिवार्य रूप से 'बैक ऑफ, मैन!' के लिए मानक बन गया है।


4
मुझे लगता है कि आप गलत हैं, नगनेक्स मैनुअल कहता है: "अत्यधिक अनुरोधों को विलंबित किया जाता है जब तक कि उनकी संख्या अधिकतम फट आकार से अधिक न हो"। ध्यान दें कि जब तक अधिकतम फट से अधिक नहीं होता है तब तक आपके द्वारा कहे गए विस्फोट की तुलना में पूरी तरह से अलग अर्थ है । आपने अतिरिक्त अनुरोधों के साथ फट को भी स्वीकार कर लिया है , मेरा मानना ​​है कि अतिरिक्त अनुरोध का मतलब है कि यह ज़ोन से ऊपर है, जबकि यह अभी भी अधिकतम फट से नीचे हो सकता है ।
हेंडी इरावन

10

TL; DR: यदि आप अनुरोधों के बीच अनुमत रिक्ति को बाधित किए बिना दर सीमा लागू करना चाहते हैं, तो नोडल विकल्प उपयोगी है।

मेरे पास अन्य उत्तरों को पचाने में एक कठिन समय था, और फिर मैंने Nginx से नए प्रलेखन की खोज की, जो इस का उत्तर देते हैं: https://www.nginx.com/blog/rate-limiting-nginx/

यहाँ का उचित भाग है। दिया हुआ:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

location /login/ {
  limit_req zone=mylimit burst=20;
  ...
}

फट पैरामीटर परिभाषित करता है कि एक ग्राहक ज़ोन द्वारा निर्दिष्ट दर से अधिक कितने अनुरोध कर सकता है (हमारे नमूना mylamit ज़ोन के साथ, दर सीमा 10 अनुरोध प्रति सेकंड या 1 प्रति 100 मिलीसेकंड है)। एक अनुरोध जो पिछले एक के बाद 100 मिलीसेकंड से पहले आता है, एक कतार में रखा जाता है, और यहां हम कतार का आकार 20 तक सेट कर रहे हैं।

इसका मतलब है कि अगर 21 अनुरोध एक दिए गए आईपी पते से एक साथ आते हैं, तो एनजीआईएनएक्स तुरंत अपस्ट्रीम सर्वर समूह के लिए पहले को छोड़ देता है और शेष 20 को कतार में रखता है। यह तब प्रत्येक 100 मिलीसेकंड पर कतारबद्ध अनुरोध अग्रेषित करता है, और ग्राहक को 503 लौटाता है, जब केवल एक आवक अनुरोध कतारबद्ध अनुरोधों की संख्या 20 से अधिक हो जाती है।

यदि आप जोड़-तोड़ करते हैं:

location /login/ {
  limit_req zone=mylimit burst=20 nodelay;
  ...
}

नोडेल्ले पैरामीटर के साथ, NGINX अभी भी फट पैरामीटर के अनुसार कतार में स्लॉट आवंटित करता है और कॉन्फ़िगर की गई दर सीमा को लागू करता है, लेकिन कतारबद्ध अनुरोधों को अग्रेषित करने से नहीं। इसके बजाय, जब कोई अनुरोध "बहुत जल्द" आता है, तो एनजीआईएनएक्स तुरंत इसे आगे बढ़ा देता है जब तक कि कतार में इसके लिए एक स्लॉट उपलब्ध नहीं होता है। यह उस स्लॉट को "लिया गया" के रूप में चिह्नित करता है और इसे किसी अन्य अनुरोध के उपयोग के लिए तब तक मुक्त नहीं करता है जब तक कि उपयुक्त समय नहीं निकल जाता है (हमारे उदाहरण में, 100 मिलीसेकंड के बाद)।


6

जिस तरह से मैं इसे देखता हूं वह इस प्रकार है:

  1. जब तक ज़ोन की दर को पार नहीं किया जाता है तब तक अनुरोधों को जितनी तेज़ी से संभव हो सकेगा। ज़ोन की दर "औसत" है, इसलिए यदि आपकी दर है 1r/sऔर फट जाए तो आपके 10पास 10 सेकंड की विंडो में 10 अनुरोध हो सकते हैं।

  2. ज़ोन की दर पार होने के बाद:

    ए। इसके बिना nodelay, आगे के अनुरोधों में burstदेरी होगी।

    ख। इसके साथ nodelay, आगे अनुरोधों को burstजितनी जल्दी हो सके उतनी तेजी से सेवा दी जाएगी।

  3. जब burstसीमा पार हो जाती है, तो सर्वर त्रुटि प्रतिक्रिया लौटाएगा जब तक कि फट विंडो समाप्त न हो जाए। दर 1r/sऔर फट के लिए उदाहरण के लिए 10, ग्राहक को अगले स्वीकृत अनुरोध के लिए 10 सेकंड तक इंतजार करना होगा।


3

सेटिंग यह परिभाषित करती है कि क्या अनुरोधों में देरी होगी, ताकि वे वांछित दर के अनुरूप हों या क्या वे बस अस्वीकार कर दिए जाएंगे ... कुछ हद तक यह कि सर्वर द्वारा प्रबंधित की गई दर सीमित है या जिम्मेदारी क्लाइंट को दी गई है।

nodelay वर्तमान

अनुरोधों को जितनी जल्दी हो सके संभाला जाएगा; निर्दिष्ट सीमा पर भेजे गए किसी भी अनुरोध को कोड सेट के साथ अस्वीकार कर दिया जाएगाlimit_req_status

nodelay अनुपस्थित (उर्फ देरी से)

अनुरोधों को एक ऐसी दर पर नियंत्रित किया जाएगा जो निर्दिष्ट सीमा के अनुरूप है। इसलिए उदाहरण के लिए यदि कोई दर 10 req / s से निर्धारित होती है, तो प्रत्येक अनुरोध को> = .1 (1 / दर) सेकंड में नियंत्रित किया जाएगा, जिससे दर को पार नहीं होने दिया जा सकता, लेकिन अनुरोधों को वापस लेने की अनुमति दी जाएगी। यदि पर्याप्त अनुरोध बाल्टी को ओवरफ्लो करने के लिए वापस आता है (जो समवर्ती कनेक्शन सीमा द्वारा भी रोका जाएगा), तो उन्हें कोड सेट के साथ खारिज कर दिया जाता है limit_req_status

Gory विवरण यहाँ हैं: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#Lod3 जहां उस तर्क को लात मारता है जब सीमा अभी तक पारित नहीं हुई है और अब देरी हो गई है वैकल्पिक रूप से अनुरोध पर लागू होने जा रहा है। nodelayविशेष रूप से निर्देश से आवेदन यहाँ खेलने में आता है: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L495delay ऊपर का मान 0 ट्रिगर होने के कारण होता है हैंडलर तुरंत वापस लौटता है NGX_DECLINEDजो अगले हैंडलर के लिए अनुरोध पारित करता है (इसके बजाय NGX_AGAINप्रभावी रूप से इसे फिर से संसाधित करने की आवश्यकता होगी)।


1

मुझे समझ नहीं आया कि पहली बार जब मैं https://www.nginx.com/blog/rate-limiting-nginx/ से परिचय पढ़ रहा था ।

अब मुझे यकीन है कि मैं समझ गया हूं और मेरा जवाब अब तक का सबसे अच्छा है। :)

मान लीजिए: 10r/sसेट किया गया है, सर्वर की अधिकतम क्षमता उदा है 10000r/sजो कि है 10r/msऔर इस समय केवल 1 क्लाइंट है।

तो यहाँ 10r/s per IP burst=40 nodelayऔर के बीच मुख्य अंतर है 10r/s per IP burst=40

यहाँ छवि विवरण दर्ज करें

जैसा कि https://www.nginx.com/blog/rate-limiting-nginx/ डॉक्यूमेंटेड है ( मैं पहले लेख को पढ़ने की जोरदार सलाह देता हूं ( टू-स्टेज रेट लिमिटिंग सेक्शन को छोड़कर ), यह व्यवहार एक समस्या को ठीक करता है। कौनसा?:

हमारे उदाहरण में, कतार में 20 वें पैकेट को आगे बढ़ने के लिए 2 सेकंड इंतजार करना पड़ता है, जिस पर एक प्रतिक्रिया यह क्लाइंट के लिए उपयोगी नहीं हो सकती है।

मेरे द्वारा किए गए मसौदे की जांच करें, 40thअनुरोध पर प्रतिक्रिया मिलती है 1sजबकि दूसरे 40thपर प्रतिक्रिया मिलती है 4s

यह सर्वर की क्षमता का सबसे अच्छा उपयोग कर सकता है: x r/sकिसी ग्राहक / आईपी के लिए बाधा को दूर रखते हुए यथासंभव त्वरित प्रतिक्रिया भेजता है ।

लेकिन यहां भी लागत है। लागत होगी:

आप कई ग्राहकों सर्वर आइए कहते हैं ग्राहक पर कतार है, तो A, Bऔर C

बिना nodelay, अनुरोध के समान आदेश में परोसा जाता है ABCABCABC
के साथ nodelay, आदेश होने की अधिक संभावना है AAABBBCCC


मैं यहां https://www.nginx.com/blog/rate-limiting-nginx/ लेख को समेटना चाहूंगा ।

इन सबसे ऊपर, सबसे महत्वपूर्ण विन्यास है x r/s

  1. x r/s केवल, अतिरिक्त अनुरोध तुरंत अस्वीकार कर दिए जाते हैं।

  2. x r/s+ burst, अतिरिक्त अनुरोध कतारबद्ध हैं।

1.बनाम 2., लागत यह है कि ग्राहक की ओर से, कतारबद्ध अनुरोध बाद के पुनर्खरीद की संभावना को बढ़ाते हैं जो कि सेवा होने का मौका होगा।

उदाहरण के लिए, 10r/s burst=20बनाम 10r/s, बाद के 11thअनुरोध के तहत अनुरोध को तुरंत अस्वीकार कर दिया जाना चाहिए, लेकिन अब यह कतारबद्ध है और इसे परोसा जाएगा। 11thअनुरोध लेता 21thअनुरोध के मौका।

  1. x r/s+ burst+ nodelay, पहले से ही समझाया।

पुनश्च लेख की दो-चरण दर सीमा अनुभाग बहुत भ्रामक है। मुझे समझ में नहीं आता है, लेकिन यह मामला नहीं लगता है।

उदाहरण के लिए:

इस कॉन्फ़िगरेशन के साथ, एक क्लाइंट जो 8 r / s पर अनुरोधों की एक सतत स्ट्रीम बनाता है, वह निम्न व्यवहार का अनुभव करता है।

8 आर / एस? गंभीरता से? छवि में दिखाए गए 3 सेकंड के भीतर 17, 17/3 = 8 में 17 अनुरोध हैं?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.