मैं एक ऐसी ही निर्णय लेने के बीच में वास्तव में हूँ अनुरोध/प्रतिक्रिया पैटर्न को लागू करने के लिए उपलब्ध नमूने हैं। मेरे मामले में मेरे पास एक वेब भूमिका में चल रही डब्ल्यूसीएफ सेवा है जो कार्यकर्ता-भूमिकाओं के लिए गणना को बंद करना चाहिए। जब परिणाम गणना की गई है, तो वेब भूमिका ग्राहक को जवाब वापस कर देगी।
मेरे बुनियादी डेटा संरचना ज्ञान मुझसे कहता है कि मैं कुछ है कि एक गैर कतार रास्ते में एक कतार के रूप में बनाया गया है का उपयोग कर से बचना चाहिए। इसका मतलब है कि एक कतार हमेशा फीफो में सेवा की जानी चाहिए। इसलिए मूल रूप से दोनों अनुरोधों और प्रतिक्रियाओं के लिए कतारों का उपयोग करते हुए, क्लाइंट को डेटा वापस करने के लिए प्रतीक्षा करने वाले थ्रेडों को तब तक प्रतीक्षा करनी होगी जब तक कि गणना संदेश प्रतिक्रिया कतार के "शीर्ष" पर न हो, जो इष्टतम नहीं है।अगर एज़ूर टेबल का उपयोग करके प्रतिक्रियाओं को संग्रहित किया जाता है, तो अनावश्यक ओवरहेड बनाने वाले संदेशों के लिए थ्रेड मतदान
क्या मैं विश्वास करता हूं कि इस समस्या का एक संभावित समाधान अनुरोधों के लिए कतार का उपयोग कर रहा है। यह प्रतिस्पर्धी उपभोक्ता पैटर्न और इस प्रकार भार संतुलन के उपयोग को सक्षम बनाता है। इस कतार में भेजे गए संदेशों पर आपने संदेश पर correlationId property सेट किया है। उत्तर के लिए Azure सेवा बस का पब/उप भाग ("विषय") भाग correlation filter के साथ टॉगरटर का उपयोग किया जाता है। जब आपके बैक-एंड ने अनुरोध को संसाधित किया है, तो मूल अनुरोध में दिए गए सहसंबंध के साथ "प्रतिक्रिया विषय" के परिणामस्वरूप प्रकाशित हुआ। अब इस प्रतिक्रिया को आपके सदस्यता द्वारा CreateSubscribtion (क्षमा करें, मैं स्पष्ट रूप से दो से अधिक लिंक पोस्ट नहीं कर सकता, इसे Google पर पोस्ट नहीं कर सकता) को सहसंबंध फ़िल्टर का उपयोग करके पुनर्प्राप्त किया जा सकता है, और जवाब प्रकाशित होने पर इसे अधिसूचित किया जाना चाहिए। ध्यान दें कि CreateSubscribtion भाग को ऑनस्टार्ट विधि में एक बार किया जाना चाहिए। फिर आप उस सबस्क्राइबशन पर एसिंक BeginRecieve कर सकते हैं और दिए गए कॉलबैक में भूमिका अधिसूचित की जाएगी जब इसके अनुरोध में से किसी एक के लिए प्रतिक्रिया उपलब्ध है। सहसंबंध Id आपको बताएगा कि किस अनुरोध के लिए प्रतिक्रिया है। तो आपकी आखिरी चुनौती इस प्रतिक्रिया को क्लाइंट कनेक्शन वाले थ्रेड पर वापस दे रही है।
यह सहसंबंध के साथ शब्दकोश बनाने (संभवतः GUID) के साथ कुंजी और प्रतिक्रिया के रूप में शब्दकोश बनाकर हासिल किया जा सकता है। जब आपकी वेब भूमिका का अनुरोध हो जाता है तो यह guid बनाता है, इसे सहसंबंध के रूप में सेट करें, इसे हैशसेट जोड़ें, कतार में संदेश को आग लगाएं और फिर Guid ऑब्जेक्ट पर Monitor.Wait() को कॉल करें। फिर विषय सदस्यता द्वारा लागू की गई रिसीव विधि को शब्दकोश में प्रतिक्रिया जोड़ें और उसके बाद उसी guid ऑब्जेक्ट पर Monitor.Notify() को कॉल करें। यह आपके मूल अनुरोध-धागे को जागृत करता है और अब आप अपने क्लाइंट को जवाब दे सकते हैं (या कुछ। मूल रूप से आप बस अपने धागे को सोना चाहते हैं और प्रतीक्षा करते समय किसी भी संसाधन का उपभोग नहीं करते हैं)
यही वह है जो मैं सोच रहा था। हम पहले से ही एक सहसंबंध आईडी GUID रणनीति शामिल कर रहे हैं, लेकिन यह उस प्रतिक्रिया कतार पर बहुत सारे मतदान की तरह लगता है जहां वेब भूमिका अप्रासंगिक प्रतिक्रिया खींचती है। जब मैं GetMessage() को कॉल करता हूं, तो संभावित घटना में इसे तुरंत रिलीज़ करने का कोई तरीका है कि यह वह प्रतिक्रिया नहीं है जिसका मैं इंतजार कर रहा था? या, वैकल्पिक रूप से, शायद मैं प्रत्येक वेब रोल उदाहरण को एक समर्पित कतार दे सकता हूं। फिर भी, ये कतार फीफो नहीं हैं, इसलिए मुझे अभी भी उस सहसंबंध आईडी की जांच करनी होगी। विचार? –
इस के साथ पकड़ यह है कि यदि आपके पास वेबलोल (या एक ही वेब भूमिका पर चलने वाले भिन्न अनुरोध) के एक से अधिक उदाहरण हैं, तो एक मौका है कि उदाहरण 1 के लिए इच्छित संदेश उदाहरण 2 द्वारा उठाया जाएगा, जो होगा सहसंबंध आईडी की जांच करें, महसूस करें कि यह इसके लिए इंतजार नहीं कर रहा है और इसे कतार पर वापस रखना है। मैंने यह कोशिश की है और यह बहुत अच्छी तरह से स्केल नहीं करता है। टेबल विचार बहुत बेहतर है। – knightpfhor
इस टिप्पणी को जोड़ने के लिए धन्यवाद। मैं उस चीज़ के बारे में चिंतित था, क्योंकि आईआईएस एक ही बॉक्स पर एक साथ कई अनुरोधों को संसाधित कर सकता है। –