2013-02-28 6 views
6

मैं अपने आरईएसटी एपीआई पर कुछ थ्रॉटल लागू करने की कोशिश कर रहा हूं। typical approach अनुरोध को अवरुद्ध करने के लिए एक निश्चित दहलीज के बाद है (403 या 429 प्रतिक्रिया के साथ)। हालांकि, मैंने one api देखा है जो को प्रतिक्रिया में देरी करता है।देरी के साथ http एपीआई कॉल

जैसे ही आप एपीआई को कॉल करते हैं, हम पिछले पांच मिनट की अवधि में प्रति सेकंड (सी/एस) की औसत कॉल देख रहे होंगे। यहाँ क्या होगा:

  • से अधिक 3 सी/एस

    और हम अधिक 5c/s 2 सेकंड की देरी

  • जोड़ सकते हैं और हम अधिक 7c/एस 4 सेकंड की देरी

  • जोड़ सकते हैं और हम एक 5 सेकंड की देरी

जोड़ने ग्राहक के दृष्टिकोण से, मैं इस एक त्रुटि वापस हो रही तुलना में बेहतर होने देखते हैं। सबसे बुरा यह हो सकता है कि आप धीमा हो जाएंगे।

मुझे आश्चर्य है कि यह को एप सर्वर पर नकारात्मक प्रभाव के बिना कैसे प्राप्त किया जा सकता है। यानी उन देरी को जोड़ने के लिए, सर्वर को अनुरोध को खोलने की आवश्यकता है, जिससे इसे अधिक से अधिक अनुरोध प्रोसेसर व्यस्त रखने का कारण बनता है, जिसका अर्थ है कि इसमें नए अनुरोध आने की कम क्षमता है।

इसे पूरा करने का सबसे अच्छा तरीका क्या है? (यानी यह कुछ ऐसा है जो वेब सर्वर/लोड बैलेंसर पर किया जा सकता है ताकि एप्लिकेशन सर्वर नकारात्मक रूप से प्रभावित न हो? क्या इस उद्देश्य के लिए कोई थ्रॉटलिंग परत जोड़ा जा सकता है?)

हम ' Django/Tastypie का उपयोग कर फिर से, लेकिन सवाल वास्तुकला/वैचारिक स्तर पर अधिक है।

उत्तर

3

यदि आप सिंक्रोनस एप्लिकेशन सर्वर का उपयोग कर रहे हैं जो Django अनुप्रयोगों के लिए सबसे आम सेटअप है (उदाहरण के लिए डिफ़ॉल्ट --worker-class sync के साथ एक बंदूकधारी), तो अनुप्रयोग में ऐसी देरी जोड़ने से वास्तव में प्रदर्शन पर बहुत बुरा प्रभाव पड़ता है। विलंबित अवधि को संभालने वाला एक कार्यकर्ता देरी अवधि के दौरान अवरुद्ध कर दिया जाएगा।

लेकिन आप एसिंक्रोनस एप्लिकेशन सर्वर का उपयोग कर सकते हैं (उदाहरण के लिए '- वर्कर-क्लास गीवेंट' के साथ गनिकोर्न) और फिर ओवरहेड नगण्य होना चाहिए। एक कर्मचारी जो विलंबित अनुरोधों को संभालता है, देरी की प्रगति के दौरान अन्य अनुरोधों को संभालने में सक्षम है।

रिवर्स प्रॉक्सी सर्वर में ऐसा करना एक बेहतर विकल्प हो सकता है, क्योंकि यह नीति को आसानी से और लचीला रूप से समायोजित करने की अनुमति देता है। an external nginx module for exactly such thing है।

+0

धन्यवाद! ऐसा लगता है कि मैं जिस चीज की तलाश कर रहा था (यकीन नहीं है कि, लेकिन शायद ऐसा होगा)। – gingerlime

+0

क्या वह 'nginx-delay-module' किसी भी तरह से Django से निर्देश लेने में सक्षम है? उदाहरण के लिए यदि दुर्व्यवहार के विचारों के माध्यम से दुरुपयोग की पहचान की जाती है, तो क्या मैं उस प्लगइन को निर्देश दे सकता हूं कि nginx की तरफ से प्रतिक्रिया में देरी हो? आदर्श रूप से मैं इसका उपयोग कर डीआरएफ के लिए कस्टम थ्रॉटल क्लास लिखना चाहता हूं। – dtgq

संबंधित मुद्दे