2009-11-28 10 views
7

मैं कक्षा पुस्तकालय पर काम कर रहा हूं जो किसी तृतीय-पक्ष की वेबसाइट से जानकारी प्राप्त करता है। उपयोग की जा रही वेबसाइट को एक निश्चित समय अवधि (~ 0.5 सेकंड) के भीतर बहुत से अनुरोध किए जाने पर प्रतिक्रिया देना बंद कर देगा।वेब अनुरोधों को थ्रॉटल करने के लिए किसकी ज़िम्मेदारी है?

मेरी लाइब्रेरी का सार्वजनिक तरीका सीधे वेब सर्वर पर एक संसाधन से संबंधित संसाधन से संबंधित है। दूसरे शब्दों में, प्रत्येक बार एक विधि कहा जाता है, HttpWebRequest बनाया जाता है और सर्वर को भेजा जाता है। यदि सब कुछ ठीक हो जाता है, तो कॉलर पर एक एक्सएमएल फ़ाइल लौटा दी जाती है। हालांकि, यदि यह 0.5 से कम में दूसरा वेब अनुरोध है, तो अनुरोध टाइमआउट होगा।

मेरी दुविधा इस बात पर निहित है कि मुझे अनुरोध थ्रॉटलिंग (अगर बिल्कुल) कैसे संभालना चाहिए। जाहिर है, मैं नहीं चाहता कि कॉलर प्रतिक्रिया के लिए इंतज़ार कर बैठे - खासकर अगर मैं पूरी तरह से निश्चित हूं कि उनका अनुरोध समय-समय पर होगा।

क्या मेरी लाइब्रेरी को कतारबद्ध करने और मेरे द्वारा बनाए गए वेबरेक्वेस्ट को थ्रॉटल करने के लिए और अधिक समझदारी होगी, या क्या मेरी लाइब्रेरी केवल अपवाद फेंक देगी यदि कोई ग्राहक एपीआई कॉल के बीच पर्याप्त इंतजार नहीं करता है?

+0

जस्टिन। क्या वह वेबसाइट है जिसे आप अपनी या तीसरी पार्टी तक पहुंच रहे हैं। मेरी "अच्छी नागरिक" टिप्पणियां इस पर आधारित थीं कि यह तीसरी पार्टी है, लेकिन अन्य ने अपनी साइट ग्रहण की है। – Andiih

+0

साइट वास्तव में एक तृतीय पक्ष साइट है। यह इंगित करने के लिए धन्यवाद कि मैंने इसे निर्दिष्ट नहीं किया था। मैंने स्पष्ट करने के लिए अपना प्रश्न अपडेट किया है। –

उत्तर

6

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

मुझे यह भी विश्वास है कि यह एक अच्छा नागरिक होने के लिए लाइब्रेरी लेखक की ज़िम्मेदारी है, और लाइब्रेरी के डिफ़ॉल्ट ऑपरेशन के लिए डेटा प्रदाता की शर्तों का पालन करना है।

+0

+1। मैं लगभग डेटा समस्या प्रदाता के परिप्रेक्ष्य से इस समस्या को देखने के लिए भूल गया। लेकिन फिर मैं कैसे गारंटी दूंगा कि परिणामों को समय-समय पर प्रदान किया जाएगा, कतारबद्ध किए जा सकने वाले अनुरोधों की संख्या पर किसी प्रकार की टोपी डाले बिना? –

+1

मुझे नहीं लगता कि आपको गारंटी देने की आवश्यकता है, जब तक आप कतार आकार की क्वेरी करने के तरीकों को प्रदान करते हैं, और शायद लाइब्रेरी द्वारा लागू समय-समय पर भी। – Andiih

+0

लेकिन साथ ही, यह होने के लिए और अधिक शुद्ध नहीं होगा, अनुरोध अस्वीकार कर दिया जाए, लेकिन बस उन्हें यह बताने दें कि वे इसे बहुत तेज़ कर रहे हैं? इसके अलावा, एक दिन वास्तविक साइट कार्यान्वयन सीमा को अधिक बढ़ा सकता है, साथ ही पुस्तकालय को तानाशाह के बजाए एक संदेशवाहक बनने दें। – BigOmega

2

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

+1

निश्चित रूप से यदि आपकी लाइब्रेरी एक वेब सेवा तक पहुंचने के लिए है जो केवल 0.5 प्रति एक प्रतिक्रिया स्वीकार करेगी, और यह इसके उपयोग की शर्त है, तो यह ऐसा कुछ है जिसके बारे में आपको चिंतित होना चाहिए? – Andiih

+0

यदि कोई व्यवसाय कारण है कि आप केवल प्रति सेकंड 2 अनुरोधों की अनुमति क्यों देते हैं (हो सकता है क्योंकि डेटा अधिक बार अपडेट नहीं होता है और ग्राहक कुछ नया नहीं देख पाएंगे?), तो मैं उस थ्रॉटलिंग को उस अर्थ में नहीं कहूंगा जिसे आप चाहते हैं लोड को सीमित करने के लिए, और यह बिल्कुल ऐसा कुछ है जिसे एप्लिकेशन लागू कर सकता है। – cdonner

+0

उपयोग की जा रही वेबसाइट एक तृतीय-पक्ष साइट है, इसलिए दुर्भाग्य से आईआईएस सेटिंग्स मेरे नियंत्रण से बाहर हैं। –

3

मैं दोनों कहूंगा - आप दो स्वतंत्र प्रणालियों से निपट रहे हैं और दोनों को अत्यधिक भार से खुद को बचाने के लिए उपाय करना चाहिए। वेब सर्वर को इनकमिंग कनेक्शन से इंकार कर देना चाहिए, और क्लाइंट लाइब्रेरी को धीमे या उत्तरदायी बाहरी सेवा के अनुरोधों को कम करने के लिए कदम उठाने चाहिए। क्लाइंट पर इस से निपटने के लिए एक आम पैटर्न 'सर्किट ब्रेकर' है जो बाहरी सेवा को कॉल करता है, और विफलता के बाद एक निश्चित अवधि के लिए तेज़ी से विफल रहता है।

+0

यह अच्छा होगा अगर अनुरोध अस्वीकार कर दिया गया था, केवल अनदेखा करने के बजाय। सर्किट ब्रेकर पैटर्न को इंगित करने के लिए धन्यवाद, हालांकि। मैं निश्चित रूप से समय देख सकता हूं जब यह उपयोगी होगा। –

1

यह किस प्रकार का ग्राहक है? क्या यह एक इंटरेक्टिव क्लाइंट है, उदाहरण के लिए: जीयूआई आधारित ऐप?

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

+0

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

+0

आपने उल्लेख किया है कि सर्वर एक निश्चित समय (0.5s) के साथ "बहुत अधिक अनुरोध" भेजे जाने पर अनुरोधों को थ्रॉटल करता है। "बहुत सारे अनुरोध" कितने हैं? यदि आप इसके बारे में सोचते हैं, यदि 0.5s सीमा है, तो जीयूआई आधारित क्लाइंट के लिए यह वास्तव में मुश्किल हो सकता है। वैकल्पिक रूप से, आप अपने जीयूआई लाइब्रेरी को 'एन' एसिंक अनुरोधों से अधिक नहीं होने के लिए आर्किटेक्ट कर सकते हैं, ताकि आप सर्वर को कभी भी हथौड़ा न दें। मैं एन = 2 को सीमित कर दूंगा (और इसे अपने उपयोगकर्ताओं के लिए कॉन्फ़िगर करने योग्य बना दूंगा)। और ग्राहक प्रगति अधिसूचनाएं देने के लिए एक प्रतिनिधि का उपयोग कर एक तंत्र है। "अच्छे नागरिक" भाग के लिए – feroze

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

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