किन परिस्थितियों में (यदि कोई है) दो सर्वरों को क्वेरी करना और केवल सबसे तेज़ प्रतिक्रिया का उपभोग करना अच्छा है?


12

मैंने पूछा है कि अब SO पर समुदाय द्वारा हटाया गया प्रश्न क्या है कि कोई जावास्क्रिप्ट का उपयोग क्यों करेगा Promise.race, और एक उच्च प्रतिनिधि उपयोगकर्ता इस पर टिप्पणी करता है:

यदि आपके पास दो सेवाएं हैं जो कुछ मूल्य की गणना करती हैं तो आप उन्हें समानांतर में दोनों का उपयोग कर सकते हैं और उपयोग कर सकते हैं जो कभी भी पहले मूल्य को लौटाया जाता है, एक क्वेरी के बजाय, एक असफलता की प्रतीक्षा में, और फिर दूसरे को क्वेरी करते हुए।

मैं अतिरेक और इस उपयोग के मामले के बारे में सामान्य रूप से गुगली कर रहा हूं, लेकिन मुझे कुछ भी नहीं मिला और, मेरे POV से, यह एक अच्छा विचार नहीं है कि यदि आप प्रतिक्रिया का उपयोग नहीं करने जा रहे हैं, तो बस एक सर्वर / सेवा में वर्कलोड जोड़ें।


खिलौना उदाहरण: हमेशा एस्कॉर्ट का उपयोग करने के बजाय, आप डेटा को कॉपी करते हैं, इसे क्विकसॉर्ट, और एक मर्ज, और एक हेस्पोर्ट, ... आदि में भेजते हैं। आपको यह देखने के लिए इनपुट का निरीक्षण करने की आवश्यकता नहीं है कि क्या यह एक देशज मामला है उन लोगों में से किसी के लिए , क्योंकि यह उन सभी के लिए एक देशभक्तिपूर्ण मामला नहीं होगा
कैलथ

डीन और बैरोसो पेपर द टेल एट स्केल ने इस दृष्टिकोण "हेजेड रिक्वेस्ट" पर भिन्नता जताई। यह त्रुटि दर और विलंबता में लंबी पूंछ परिवर्तनशीलता को नियंत्रित करने के लिए कई संबंधित दृष्टिकोणों के पेशेवरों और विपक्षों पर भी चर्चा करता है।
डैनियल प्राइडेन

दूसरा "सर्वर अनुरोध" एक नकली हो सकता है। यह सिर्फ 5 सेकंड के लिए चाहते हैं और फिर एक प्लेसहोल्डर प्रतिक्रिया वापस कर सकते हैं। यह आपको वास्तविक अनुरोध पर टाइमआउट मिलता है।
user253751

एक Lyft ऑर्डर करें और फिर एक Uber ऑर्डर करें। जो भी पहले आता है ले लो।
user2023861

इस उपमा में @ user2023861, जबकि एक ड्राइवर आपके स्थान की ओर लापरवाही से गाड़ी चला रहा था, वह / वह दूसरे अनुरोध पर ले सकता था
एडेलिन

जवाबों:


11

मैं तर्क दूंगा कि यह एक अर्थशास्त्र का सवाल है। हालाँकि, यह एक निर्णय कॉल है जो इंजीनियरों को करने में सक्षम होना चाहिए। इसलिए, मैं जवाब दे रहा हूं।

मैं अपने उत्तर को चार भागों में विभाजित कर रहा हूं:

  • जोखिम प्रबंधन
  • रणनीतियाँ
  • लागत
  • सहज बोध

जोखिम प्रबंधन

तो, कभी-कभी आपका क्लाइंट सर्वर से प्रतिक्रिया प्राप्त करने में विफल रहता है। मुझे लगता है कि यह एक प्रोग्रामेटिक त्रुटि के कारण नहीं है (अन्यथा समाधान इसे ठीक करना है, इसलिए ऐसा करें)। इसके बजाय, यह आपके नियंत्रण से परे एक भाग्यशाली स्थिति के कारण होना चाहिए ...

लेकिन अपने ज्ञान से परे नहीं। आपको पता होना चाहिए:

  • कितनी बार होता है
  • इसका क्या प्रभाव पड़ता है।

उदाहरण के लिए, यदि विफल और पुन: प्रयास केवल 2% समय के लिए होता है, तो संभवतः इसे संबोधित करने के लायक नहीं है। यदि यह समय का लगभग 80% होता है, तो अच्छी तरह से ... निर्भर करता है ...

ग्राहक को कितना समय इंतजार करना पड़ता है? और यह कैसे लागतों में तब्दील होता है ... आप देखते हैं, आपके पास एक नियमित आवेदन में थोड़ी देरी है, यह शायद एक बड़ी बात नहीं है। यदि यह महत्वपूर्ण है, और आपके पास वास्तविक समय एप्लिकेशन या ऑनलाइन वीडियो गेम है, तो यह उपयोगकर्ताओं को दूर कर देगा, और आप शायद अधिक या बेहतर सर्वर में निवेश करने से बेहतर हैं। अन्यथा, आप शायद "लोडिंग" या "सर्वर के लिए प्रतीक्षा" संदेश डाल सकते हैं। जब तक, विलंब वास्तव में बड़ा होता है (दसियों सेकंड के क्रम में), तब नियमित आवेदन के लिए यह बहुत अधिक हो सकता है।


रणनीतियाँ

जैसा कि मैंने ऊपर कहा, इस समस्या पर जाने के लिए एक से अधिक तरीके हैं। मुझे लगता है कि आप पहले से ही कोशिश-विफल-पुनर्प्रयास लूप लागू करेंगे। तो, हम देखते हैं ...

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

अब, ध्यान दें, मैं कहता हूं कि ये अभी भी विफल हो सकते हैं। अगर हम मानते हैं कि किसी सर्वर की क्वेरी में विफलता का 80% मौका है, तो दो सर्वरों के समानांतर क्वेरी में विफलता का 64% मौका है। इस प्रकार, आपको अभी भी पीछे हटना पड़ सकता है।

तेजी से सर्वर को चुनने और इसका उपयोग करने का एक बोनस लाभ यह है कि नेटवर्क समस्याओं के कारण तेजी से सर्वर भी विफल होने की कम संभावना है।

जो मुझे याद दिलाता है, यदि आप यह पता लगा सकते हैं कि अनुरोध विफल क्यों है, तो ऐसा करें। यह आपको स्थिति को बेहतर ढंग से प्रबंधित करने में मदद कर सकता है, भले ही आप असफलताओं को रोक न सकें। उदाहरण के लिए, क्या आपको सर्वर की तरफ अधिक स्थानांतरण गति की आवश्यकता है?

कुछ और:

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

और किसने कहा कि आपको इनमें से केवल एक करना है? आप एक लोडिंग संदेश डाल सकते हैं, कई सर्वरों को क्वेरी कर सकते हैं जो व्रल्ड में फैले हुए हैं ताकि तेजी से उठा जा सके और केवल उसी का उपयोग करें जिससे विफलता पर, लूप पर पुन: प्रयास करें, और उन सर्वरों में से प्रत्येक में लोड संतुलन के साथ मशीनों का एक समूह हो। । क्यों नहीं? खैर, लागत ...


लागत

चार लागतें हैं:

  • विकास की लागत (आमतौर पर बहुत सस्ती)
  • तैनाती की लागत (आमतौर पर उच्च)
  • लागत रनटाइम (अनुप्रयोग के प्रकार और व्यवसाय मॉडल पर निर्भर करता है)
  • विफलता की लागत (शायद कम है, लेकिन बहुत कम नहीं)

आपको उन्हें संतुलित करना होगा।

उदाहरण के लिए, हम कहें कि आप प्रति संतुष्ट उपयोगकर्ता के बारे में एक डॉलर कमाते हैं। कि आपके पास प्रतिदिन 3000 उपयोगकर्ता हैं। यह अनुरोध लगभग 50% समय विफल रहता है। और यह कि 2% उपयोगकर्ता अनुरोध के विफल होने पर भुगतान किए बिना छोड़ देते हैं। इसका मतलब है कि आप हार रहे हैं (3000 * 50% * 2%) प्रति दिन 30 डॉलर। अब, हम कहते हैं कि नई सुविधा को विकसित करने में आपको 100 डॉलर का खर्च आएगा और सर्वर को तैनात करने में आपको 800 डॉलर का खर्च आएगा - और रनटाइम की लागत को अनदेखा करना - इसका मतलब है कि आपके पास (100 + 800) / 30 में निवेश की वापसी होगी ) तीस दिन। अब, आप अपना बजट देख सकते हैं और निर्णय ले सकते हैं।

इन मूल्यों को वास्तविकता का प्रतिनिधि न मानें, मैंने उन्हें गणित के लिए चुना।

परिशिष्टों:

  • याद रखें कि मैं विवरणों को भी अनदेखा कर रहा हूं। उदाहरण के लिए, आपके पास बहुत कम लागत हो सकती है लेकिन सीपीयू समय के लिए भुगतान करना होगा और आपको इस पर विचार करने की आवश्यकता है।
  • कुछ ग्राहक सराहना कर सकते हैं यदि आप अनावश्यक अनुरोधों में उनके डेटा पैकेज को बर्बाद नहीं करते हैं।
  • अपने उत्पाद को बेहतर बनाने से प्राकृतिक विज्ञापन लाने में मदद मिल सकती है।
  • अवसर लागत मत भूलना। क्या आपको कुछ और विकसित करना चाहिए?

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


सहज बोध

अनुभव द्वारा बढ़ावा अगर अंतर्ज्ञान। मैं हर बार इस तरह का विश्लेषण करने का सुझाव नहीं दे रहा हूं। कुछ लोग करते हैं, और यह ठीक है। मैं आपको इसके बारे में कुछ समझने और इसके लिए एक अंतर्ज्ञान विकसित करने का सुझाव दे रहा हूं।

फ़ुथर्मोर, इंजीनियरिंग में, वास्तविक ज्ञान से प्राप्त ज्ञान से अलग, हम अभ्यास में भी सीखते हैं कि क्या काम करता है और क्या नहीं करता है। इसलिए, यह देखने के लिए अक्सर बुद्धिमान होता है कि कला की स्थिति क्या है ... हालांकि, कभी-कभी आपको अपने क्षेत्र के बाहर देखने की आवश्यकता होती है।

इस मामले में, मैं ऑनलाइन वीडियो गेम देखूंगा। उनके पास लोड स्क्रीन है, उनके पास कई सर्वर हैं, वे विलंबता के आधार पर एक सर्वर चुनेंगे, और वे उपयोगकर्ता को सर्वर स्विच करने की अनुमति भी दे सकते हैं। हम जानते हैं कि काम करता है।

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


2
मुझे नहीं लगता कि मुझे यह कहने की आवश्यकता है, लेकिन यह एक शानदार उत्तर है :) मुझे पता था कि मैं इसे पहली 10 पंक्तियों में स्वीकार करूंगा, लेकिन मैंने आपको अभी भी असफल होने और इसे अंत तक पढ़ने का अवसर दिया है। आपने नहीं
एडेलिन

9

यह स्वीकार्य है, यदि क्लाइंट का समय सर्वर पर समय से अधिक मूल्यवान है।

यदि क्लाइंट को तेज और सटीक होना चाहिए। आप कई सर्वरों को क्वेरी कर सकते हैं। और यदि कोई मान्य उत्तर प्राप्त होता है तो अनुरोध को रद्द करना अच्छा है।

और निश्चित रूप से सर्वर के मालिकों / प्रबंधकों से परामर्श करना हमेशा बुद्धिमान होता है।


आपको अनुरोध को रद्द करने की आवश्यकता क्यों है ? निश्चित रूप से वह व्यक्तिपरक है।
J --Mᴇᴇ

@ J @M।, यह व्यामोह में निर्माण है। मैंने एक बार एक ऐसी प्रणाली के साथ काम किया, जिसने अपनी कतार को साफ नहीं किया और जब कतार भर गई तो यह दुर्घटनाग्रस्त हो गई (हाँ यह पेशेवर सॉफ्टवेयर था)।
तून Krijthe

4

यह तकनीक विलंबता को कम कर सकती है। सर्वर प्रतिक्रिया समय नियतात्मक नहीं है। पैमाने पर यह संभावना है कि खराब प्रतिक्रिया समय दिखाने वाला कम से कम एक सर्वर होगा। इसलिए उस सर्वर का उपयोग करने से कुछ भी खराब प्रतिक्रिया समय होगा। कई सर्वरों को सबमिट करने से एक खराब प्रदर्शन करने वाले सर्वर से बात करने का जोखिम कम हो जाता है।

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

यहाँ एक कागज है , और दूसरा । मुझे याद है कि एक Google पेपर उनके कार्यान्वयन को भी पढ़ रहा था।


2

मैं ज्यादातर अन्य उत्तरों से सहमत हूं, लेकिन मुझे लगता है कि यह व्यवहार में बहुत दुर्लभ होना चाहिए। जब आप उपयोग करेंगे Promise.race(), तब मैं कुछ और सामान्य और उचित उदाहरण साझा करना चाहता था , कुछ ऐसा जो मैंने कुछ हफ़्ते पहले किया था (ठीक है, अजगर के समकक्ष)।

कहते हैं कि आपके पास कार्यों की एक लंबी सूची है, कुछ जिन्हें समानांतर में चलाया जा सकता है और कुछ को दूसरों के सामने चलाना होगा। आप सभी कार्यों को बिना किसी निर्भरता के साथ शुरू कर सकते हैं, फिर उस सूची पर प्रतीक्षा करें Promise.race()। जैसे ही पहला कार्य पूरा होता है, आप उस पहले कार्य पर निर्भर किसी भी कार्य को शुरू कर सकते हैं, और Promise.race()फिर से नई सूची में मूल सूची से अधूरे कार्यों के साथ संयुक्त कर सकते हैं। तब तक दोहराते रहें जब तक कि सभी कार्य पूरा न हो जाएं।

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


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

1
जावास्क्रिप्ट में वादे उत्सुकता से शुरू किए जाते हैं, जब new Promiseकहा जाता है, और जब कहा जाता है, तब पुनरारंभ नहीं किया Promise.race()जाता है। कुछ वादे क्रियान्वयन आलसी हैं, लेकिन उत्सुक बहुत अधिक आम हैं। आप कंसोल में एक वादा करके परीक्षण कर सकते हैं जो कंसोल में लॉग इन करता है। आप इसे तुरंत लॉग कर देखेंगे। फिर उस वादे को पास करें Promise.race()। आप देखेंगे कि यह फिर से लॉग इन नहीं करता है।
कार्ल

आह यह सच है। लेकिन पहले वादे को छोड़कर बाकी वादों की वापसी का मूल्य वादा के साथ भूल जाते हैं। अनुग्रह
एडेलिन

इसलिए मैंने कहा कि एपीआई आदर्श रूप में नहीं बनाया गया है। आपको किसी चर में कार्यों के मूल सेट को कहीं स्टोर करना होगा।
कार्ल

1

तकनीकी विचारों के अलावा, आप इस दृष्टिकोण का उपयोग तब करना चाह सकते हैं जब यह आपके वास्तविक व्यवसाय मॉडल का हिस्सा हो।

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

इसका एक विशेष रूपांतर जो ग्राहक के प्रतीक्षा समय को कम करने में मदद करता है, प्रकाशक को बोली के लिए न्यूनतम लक्ष्य मूल्य की अनुमति है, जैसे कि पहली विज्ञापनदाता बोली जो उस मूल्य को पार करती है उसे तुरंत स्वीकार कर लिया जाएगा (या, यदि कोई भी बोली से अधिक नहीं है मूल्य, अधिकतम एक लिया जाएगा)। तो इस भिन्नता में, पहली आने वाली क्वेरी जीत सकती है और दूसरे को छोड़ दिया जाता है, भले ही वे उतने ही अच्छे या बेहतर हों।

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