2009-03-05 15 views
30

मैं एक आरईएसटी एपीआई एक साथ रख रहा हूं और जैसा कि मुझे यकीन नहीं है कि यह कैसे स्केल करेगा या इसकी मांग क्या होगी, मैं इसके सीमित उपयोग दर को रेट करने में सक्षम होना चाहता हूं और अस्थायी रूप से इनकार करने में सक्षम होना चाहता हूं अनुरोध तब होता है जब बॉक्स क्षमता से अधिक हो या यदि किसी प्रकार का स्लेशडॉटेड परिदृश्य हो।एक आरईएसटी एपीआई के उपयोगकर्ताओं को सीमित करने की दर के लिए सर्वश्रेष्ठ अभ्यास?

मैं भी अस्थायी रूप से सेवा को अस्थायी रूप से नीचे लाने में सक्षम होना चाहूंगा (क्लाइंट के परिणाम देने से संकेत मिलता है कि मुख्य सेवा थोड़ा सा ऑफ़लाइन है) जब/यदि मुझे अधिक क्षमता जोड़कर सेवा को स्केल करने की आवश्यकता होती है।

क्या इस तरह की चीज़ के लिए कोई सर्वोत्तम अभ्यास है? कार्यान्वयन mysql के साथ रेल है।

उत्तर

17

यह सब बाहरी वेबसर्वर के साथ किया जाता है, जो दुनिया को सुनता है (मैं nginx या lighttpd की अनुशंसा करता हूं) के साथ यह आपके अपाचे प्रॉक्सी के हिस्से के रूप में लागू करना है।

दर सीमा के संबंध में, nginx सीमित करने में सक्षम है, यानी प्रत्येक आईपी प्रति 50 req/मिनट, सभी को 503 पेज प्राप्त करें, जिसे आप अनुकूलित कर सकते हैं।

अपेक्षित अस्थायी रूप से, रेल की दुनिया में यह विशेष रखरखाव.html पृष्ठ के माध्यम से किया जाता है। कुछ प्रकार का स्वचालन होता है जो उस फ़ाइल को बनाता है या सिमलिंक करता है जब रेल ऐप सर्वर नीचे जाते हैं। मैं फ़ाइल उपस्थिति पर निर्भर नहीं है, लेकिन ऐप सर्वर की वास्तविक उपलब्धता पर निर्भर करता हूं।

लेकिन वास्तव में आप किसी भी कनेक्शन को खोए बिना सेवाओं को शुरू/बंद करने में सक्षम हैं। अर्थात। आप विभिन्न यूनिक्स सॉकेट/आईपी पोर्ट पर ऐप सर्वर का अलग-अलग उदाहरण चला सकते हैं और बैलेंसर (nginx/lighty/haproxy) उस नए इंस्टेंस का भी उपयोग कर सकते हैं। फिर आप पुराने उदाहरण को बंद कर देते हैं और सभी क्लाइंट केवल नए के साथ परोसे जाते हैं। कोई कनेक्शन खो गया नहीं बेशक यह परिदृश्य हमेशा संभव नहीं होता है, जो आपके द्वारा नए संस्करण में पेश किए गए परिवर्तन के प्रकार पर निर्भर करता है।

हैप्रोक्सी एक बैलेंसर-केवल समाधान है। यह आपके खेत में ऐप सर्वर को अत्यधिक कुशलता से अनुरोधों को संतुलित कर सकता है।

काफी बड़ा सेवा के लिए आप खत्म-अप को साथ:

  • api.domain राउंड-रोबिन एन बैलेंसर्स को हल करने गतिशील के लिए स्थिर और पी एप्लिकेशन सर्वर के लिए एम वेबसर्वर के लिए
  • प्रत्येक संतुलन प्रॉक्सी अनुरोध सामग्री। ओह ठीक है आपके आरईएसटी एपीआई में स्थिर फाइल नहीं है, है ना?

काफी छोटी सेवा के लिए (2 के आरपीएस के तहत) सभी संतुलन एक-दो वेबसर्वर के अंदर किया जाता है।

2

मैं आपके आवेदन के बाहर की दर सीमा को लागू करने की अनुशंसा करता हूं क्योंकि अन्यथा उच्च ट्रैफ़िक के पास आपके ऐप को मारने का असर होगा। एक अच्छा समाधान यह है कि इसे mod_evasive

+1

अपाचे उच्च लोड भूमि से बाहर नहीं है? फ्रैंकोडवायर को निश्चित रूप से समेकित कनेक्शन को संभालने के लिए एसिंक नेटवर्किंग की आवश्यकता होती है और mpm_event अभी तक उत्पादन स्थिर नहीं है। बेशक अपाचे को अलग-अलग बक्से पर रखा जा सकता है ... क्या उन्हें केवल अपाचे से चिपकने के लिए खरीदने का मुद्दा है? – temoto

+1

मुझे लगता है कि यह अनुरोध की संभावित मात्रा और आवेदन के लिए प्रत्येक अनुरोध की लागत पर निर्भर करता है।मेरे अनुभव में, अपाचे बैकएंड ऐप की तुलना में परिमाण के अधिक अनुरोधों को आसानी से संभाल सकता है जो एक सह-स्थित प्रॉक्सी जुर्माना बनाता है। –

5

पहले से ही अच्छे उत्तर - यदि आप स्वयं लिमिटर को लागू नहीं करना चाहते हैं, तो 3scale (http://www.3scale.net) जैसे समाधान भी हैं जो एपीआई के लिए सीमित सीमा, विश्लेषण आदि करता है। यह एक प्लगइन का उपयोग कर काम करता है (ruby api plugin के लिए यहां देखें) जो 3 स्केल आर्किटेक्चर में हुक करता है। आप इसे वार्निश के माध्यम से भी इस्तेमाल कर सकते हैं और वर्नी सीमित प्रॉक्सी के रूप में वार्निश एक्ट कर सकते हैं।

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