2012-02-16 13 views
8

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

हमारा इरादा आदेश वेब भूमिकाओं पर उच्च प्रदर्शन सुनिश्चित करने के लिए बैक-एंड कार्यकर्ता भूमिकाओं पर कुछ भारी प्रसंस्करण ऑफलोड करने के लिए कतार लाभ उठाने के लिए है। हालांकि, हम HTTP अनुरोधों का जवाब नहीं देना चाहते हैं जब तक कि बैक-एंड वर्कर्स समाप्त नहीं हो जाते हैं और जवाब देते हैं।

उत्तर

4

मैं एक ऐसी ही निर्णय लेने के बीच में वास्तव में हूँ अनुरोध/प्रतिक्रिया पैटर्न को लागू करने के लिए उपलब्ध नमूने हैं। मेरे मामले में मेरे पास एक वेब भूमिका में चल रही डब्ल्यूसीएफ सेवा है जो कार्यकर्ता-भूमिकाओं के लिए गणना को बंद करना चाहिए। जब परिणाम गणना की गई है, तो वेब भूमिका ग्राहक को जवाब वापस कर देगी।

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

क्या मैं विश्वास करता हूं कि इस समस्या का एक संभावित समाधान अनुरोधों के लिए कतार का उपयोग कर रहा है। यह प्रतिस्पर्धी उपभोक्ता पैटर्न और इस प्रकार भार संतुलन के उपयोग को सक्षम बनाता है। इस कतार में भेजे गए संदेशों पर आपने संदेश पर correlationId property सेट किया है। उत्तर के लिए Azure सेवा बस का पब/उप भाग ("विषय") भाग correlation filter के साथ टॉगरटर का उपयोग किया जाता है। जब आपके बैक-एंड ने अनुरोध को संसाधित किया है, तो मूल अनुरोध में दिए गए सहसंबंध के साथ "प्रतिक्रिया विषय" के परिणामस्वरूप प्रकाशित हुआ। अब इस प्रतिक्रिया को आपके सदस्यता द्वारा CreateSubscribtion (क्षमा करें, मैं स्पष्ट रूप से दो से अधिक लिंक पोस्ट नहीं कर सकता, इसे Google पर पोस्ट नहीं कर सकता) को सहसंबंध फ़िल्टर का उपयोग करके पुनर्प्राप्त किया जा सकता है, और जवाब प्रकाशित होने पर इसे अधिसूचित किया जाना चाहिए। ध्यान दें कि CreateSubscribtion भाग को ऑनस्टार्ट विधि में एक बार किया जाना चाहिए। फिर आप उस सबस्क्राइबशन पर एसिंक BeginRecieve कर सकते हैं और दिए गए कॉलबैक में भूमिका अधिसूचित की जाएगी जब इसके अनुरोध में से किसी एक के लिए प्रतिक्रिया उपलब्ध है। सहसंबंध Id आपको बताएगा कि किस अनुरोध के लिए प्रतिक्रिया है। तो आपकी आखिरी चुनौती इस प्रतिक्रिया को क्लाइंट कनेक्शन वाले थ्रेड पर वापस दे रही है।

यह सहसंबंध के साथ शब्दकोश बनाने (संभवतः GUID) के साथ कुंजी और प्रतिक्रिया के रूप में शब्दकोश बनाकर हासिल किया जा सकता है। जब आपकी वेब भूमिका का अनुरोध हो जाता है तो यह guid बनाता है, इसे सहसंबंध के रूप में सेट करें, इसे हैशसेट जोड़ें, कतार में संदेश को आग लगाएं और फिर Guid ऑब्जेक्ट पर Monitor.Wait() को कॉल करें। फिर विषय सदस्यता द्वारा लागू की गई रिसीव विधि को शब्दकोश में प्रतिक्रिया जोड़ें और उसके बाद उसी guid ऑब्जेक्ट पर Monitor.Notify() को कॉल करें। यह आपके मूल अनुरोध-धागे को जागृत करता है और अब आप अपने क्लाइंट को जवाब दे सकते हैं (या कुछ। मूल रूप से आप बस अपने धागे को सोना चाहते हैं और प्रतीक्षा करते समय किसी भी संसाधन का उपभोग नहीं करते हैं)

1

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

हम ऐसी ही कुछ किया है और जब आदेशों पूरा कर रहे हैं ग्राहक के लिए वापस जबाब मदद करने के लिए SignalR की तरह कुछ का उपयोग करने के लिए देख रहे हैं।

+0

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

+0

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

+0

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

2

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

फिर WebRoles सिर्फ वांछित correlationId (RowKey) के साथ तालिका & PartitionKey की एक नज़र अप करने की ज़रूरत

+0

बहुत अच्छा विचार। मुझे यह फिट पसंद है, क्योंकि अनुरोध शुरू करने वाली केवल वेब भूमिका ने प्रतिक्रिया देखने की आवश्यकता है। मुझे अनाथ टेबल संग्रहण प्रविष्टियों के लिए कुछ प्रकार के कचरा कलेक्टर की आवश्यकता होगी जो वेब रोल विफलताओं के मामले में कभी भी पॉप-अप नहीं हो पाएंगे। –

+0

मुझे नहीं लगता कि यह एक अच्छा विचार है। फिर आप मूल रूप से Azure में समर्पित कतार/विषय सुविधाओं का उपयोग करने के बजाय एक नई कतार प्रणाली (तालिका भंडारण का उपयोग कर) बना रहे हैं। इसके अलावा आपको प्रतिक्रिया के लिए तालिका भंडारण को भी मतदान करना होगा = बहुत अक्षम और स्केलेबल नहीं। – Haukman

3

Azure सेवा बस पर कतारों में बहुत अधिक क्षमताओं और पब/उप सहित मानदंड है क्षमताओं जो कई उदाहरणों में कतार सेवा से निपटने वाले मुद्दों को हल कर सकती हैं।

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

+0

स्टैक ओवरफ्लो में आपका स्वागत है।मैं आपकी प्रतिक्रिया की सराहना करता हूं, और मैं सेवा बस विकल्प की जांच करूंगा। मैंने देखा कि आपके अन्य उत्तर Azure से संबंधित थे। मुझे उनके जैसे कई पढ़ने की उम्मीद है! –

+0

गर्मजोशी से स्वागत के लिए धन्यवाद। मैं और योगदान करने की उम्मीद करता हूं। हां, मेरा वर्तमान अनुभव सभी अजीब संबंधित है। – hocho

2

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

3

सेवा बस आधारित समाधान के लिए वहाँ के साथ Queues और Topics (pub-sub)

+0

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

+1

उसी तरह एक साधारण कतार के रूप में आप संदेशों के लिए प्रतिस्पर्धा करने की अनुमति देते हैं, एक सत्र सक्षम सेवा बस कतार आपको सत्रों के लिए प्रतिस्पर्धा करने की अनुमति देती है। यहां आप सत्र आईडी निर्दिष्ट कर सकते हैं और फिर उस सत्र को लॉक कर सकते हैं। उस सत्र में भेजे गए किसी भी संदेश को केवल आपको ही वितरित किया जाएगा। इस प्रकार यदि प्रत्येक ग्राहक के पास अपना अनन्य आईडी होता है जिसे वे सत्र आईडी के रूप में उपयोग करते हैं और फिर संदेशों को उत्तरदायित्व आईडी के रूप में भेजते हैं, तो प्रतिक्रिया की गारंटी देने के लिए आवश्यक एकमात्र कोड सहसंबंधित है कि हम उत्तर संदेश के लिए सेट करते हैं: ReplyMessage.SessionId = RequestMessage। ReplyToSessionId। यह पैटर्न नमूने में दिखाया गया है। –

+1

आपके उत्तर के लिए धन्यवाद। मैंने तुम्हें वोट दिया। मैंने [@Henrikmh] (http://stackoverflow.com/users/859401/henrikmh) से उत्तर का चयन किया क्योंकि शब्दकोश को सहसंबंध तंत्र के रूप में उपयोग करने के बारे में अंतिम अनुच्छेद के कारण। हमारे पास एक ही होस्ट से कई समवर्ती अनुरोध होंगे। सत्र दिए गए मेजबान के लिए सदस्यता समस्या हल करता है, लेकिन प्रत्येक समवर्ती अनुरोध के लिए नहीं। मेरा मानना ​​है कि आपने इसे पाठक के लिए एक अभ्यास के रूप में छोड़ दिया होगा। :-) –

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