2012-07-18 13 views
6

मैं एक खिड़कियों सेवा सी # कि MSMQ से पढ़ता है और संदेश यह एजेंटों कि एक कार्यकर्ता सूत्र में उस संदेश पर कार्रवाई करने के लिए उन्हें प्रदान करती है के प्रकार के आधार में लिखा है। आवेदन नहीं एजेंटों के साथ शुरू होता है और रनटाइम पर डायनामिक रूप से तैयार कर रहे हैं के रूप में संदेशों MSMQMSMQ समवर्ती प्रसंस्करण डिजाइन मुद्दा

में आने यह ऐसे काम करता की एक बुनियादी आंकड़ा है:

enter image description here

एजेंट कार्यकर्ता धागा काम करने में व्यस्त है संदेश अपनी स्थानीय कतार में कतारबद्ध है। अब तक सब ठीक है। लेकिन अगर किसी कारण से सेवा बंद हो जाती है, तो स्थानीय कतार सामग्री खो जाती है।

मैं यह पता लगाने की कोशिश कर रहा हूं कि इस परिदृश्य को संभालने का सबसे अच्छा तरीका क्या हो सकता है। अभी स्थानीय कतार System.Concurrent.ConcurrentQueue हैं। मैं शायद एक एसक्यूएल सी डीबी या कुछ अन्य लगातार भंडारण का उपयोग कर सकता हूं, लेकिन मैं प्रदर्शन के बारे में चिंतित हूं। मेरे दिमाग में दूसरी बात एमएसएमक्यू से पढ़ना है जब एजेंट संदेश संसाधित करने के लिए तैयार होते हैं, लेकिन समस्या यह है कि मुझे नहीं पता कि एमएसएमक्यू में कौन सा संदेश होगा।

इस मुद्दे पर मुझे क्या संभावित दृष्टिकोण मिल सकते हैं?

उत्तर

1

मैंने रेडिस पर निर्भर एक समान प्रणाली बनाई है। विचार यह है कि यह स्मृति प्रदान करता है - शेष एप्लिकेशन से तेज़ डेटा एक्सेस अलग है, और मेरी सेवा करते समय बंद नहीं होगा। इसके अलावा, यह अंततः डिस्क पर मेरे डेटा को जारी रखेगा, इसलिए मुझे विश्वसनीयता और गति के बीच एक अच्छा समझौता मिलता है।

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

+0

मुझे रेडिस का उपयोग करना अच्छा लगेगा, लेकिन आपको नहीं लगता कि यह एक ओवरकिल होगा? – Obaid

+0

बिलकुल नहीं। यह बेहद हल्का है, और यह वही करता है जो इसे अच्छी तरह से डिजाइन किया गया था, इसलिए स्वयं को कुछ नया बनाने और डिबग करने के बजाय, आप कुछ ऐसा उपयोग कर सकते हैं जो आपके लिए नौकरी कर सके। वैकल्पिक रूप से, आप स्थायी भंडारण के कुछ प्रकार के लिए त्वरित पहुँच प्राप्त करने के लिए स्मृति मैप की गई फ़ाइलों का उपयोग कर सकते हैं, लेकिन कुछ जटिलताएं हैं, और मैं धागा सुरक्षा के बारे में पता नहीं है ... –

0

एजेंटा और एजेंटब के लिए संदेश प्राप्त करने के लिए आप केवल दो नई एमएसएमएस कतार क्यों नहीं बनाते हैं, और एक नया एजेंट बनाते हैं जो (लेनदेन) मुख्य कतार से कमांड प्राप्त करता है और संदेश को उचित एजेंट कतार में भेजता है?

+0

असल में एजेंटों बनाया गतिशील के प्रकार के आधार पर कर रहे संदेश जो एमएसएमक्यू में आता है। संदेश का प्रकार 1 से एन तक भिन्न हो सकता है। तो मैं संभावित रूप से अज्ञात प्रकार के संदेशों के लिए एक अलग कतार नहीं बना सकता। – Obaid

+0

ओबैडआर क्यों नहीं? आप प्रोग्रामिंग के रूप में एक कतार बना सकते हैं, एन संभावित रूप से कितना बड़ा है? –

+0

एन लगभग 15 ~ 20 हो सकता है। लेकिन फिर मुझे दूसरी तरफ सिस्टम को बदलना होगा जहां यह संदेशों को संदेश प्रकार के आधार पर अलग-अलग कतारों में रखेगा। मैं सोच रहा था कि क्या मैं इसे किसी भी तरह से अपनी सेवा में संभाल सकता हूं। – Obaid

3

आपका डिजाइन मूल रूप से है निम्नलिखित पैटर्न लागू करता है: http://www.eaipatterns.com/MessageDispatcher.html

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

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

+0

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

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