2011-08-31 20 views
5

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

Azure कतार इस मामले पर मदद नहीं कर रहे हैं। एक विकल्प ताले और संग्रहित प्रक्रियाओं के साथ एक एसक्यूएल तालिका का उपयोग करना है; लेकिन Azure में एसक्यूएल सिंक्रनाइज़ेशन का उपयोग थोड़ा अजीब लगता है।

कोई विचार?

  • n लक्ष्य नहीं हैं:

    संपादित करें, मेरा विस्तृत (लेकिन सरलीकृत समस्या) इस प्रकार है।

  • प्रत्येक लक्ष्य पर एक निर्दिष्ट अंतराल पर काम की एक इकाई (30 सेकंड कहें - लेकिन यह प्रत्येक लक्ष्य के लिए अलग है) पर काम किया जाना चाहिए।
  • मेरे पास मीटर कर्मचारी (एच उदाहरणों में होस्ट किया गया है)।
  • काम की एक इकाई प्रसंस्करण 10 सेकंड और 1 घंटे के बीच कुछ भी ले सकता है।

विचार यह है कि मैं एक अनुसूचक एक Azure कतार में काम की इकाइयों डालता है, और मीटर कार्यकर्ताओं में से प्रत्येक के इन पढ़ सकते हैं और उन्हें प्रोसेस करेगा है।

समस्या: unit1 (जो के बारे में है target1) पर काम कर रहा

  • worker1 शुरू होता है - यह एक समय लगेगा, कहना 10 मिनट
  • 30 सेकंड पारित
  • शेड्यूलर लक्ष्य 1 के लिए काम की एक और इकाई रखता है, इकाई 13
  • कहें अच्छा नहीं

मैं कुछ विचार है, लेकिन वे नहीं लग रहे बादल पर्याप्त, तो मैं करने के लिए दिलचस्पी है -

  • worker2, unit13 पर काम कर रहे एक ही target1 के खिलाफ शुरू होता है देखें कि इस समस्या के लिए आप कौन से समाधान लागू करेंगे।

  • +2

    आपको क्यों लगता है कि कतार यहां काम नहीं करेंगे? कतार एक बार काम करने के लिए पारंपरिक तरीका है जिसे एक बार किया जाना चाहिए। कुछ बारीकियों को यकीन है, लेकिन 90% मामला कतार के साथ है। – dunnry

    +0

    मैं डेविड के जवाब से सहमत हूं, कतार आम तौर पर एक अच्छा विकल्प है। यद्यपि ऐसे समय होते हैं जब आप कतार नहीं कर सकते हैं। लेकिन अगर ऐसा है, तो अपनी समस्या का विस्तार से वर्णन करें, और हम एक बेहतर उत्तर देने का प्रयास करेंगे। –

    +0

    इस बीच, मैंने Azure के लिए UserVoice को एक विचार पोस्ट किया है - http://entlib.uservoice.com/forums/101257- विन्डोज़- Azure-integration-pack/suggestions/2050987- वितरित- सिंक्रनाइज़ेशन?ref=title ऐसा कुछ जो उन मामलों के लिए उपयोगी हो सकता है जब Queues केवल –

    उत्तर

    4

    मैंने इस तरह की चीज करने के लिए ब्लॉब पट्टियों का उपयोग करने के बारे में कुछ ब्लॉग पोस्ट लिखे हैं। http://blog.smarx.com/posts/managing-concurrency-in-windows-azure-with-leases और http://blog.smarx.com/posts/building-a-task-scheduler-in-windows-azure देखें।

    +0

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

    2

    डनरी स्पॉट-ऑन है: कतार एक ही कार्य आइटम पर काम करने से कई उदाहरणों को रोकने के लिए बहुत अच्छा काम करती है। जब आप GetMessage पर कॉल करते हैं, तो आपके द्वारा पुनर्प्राप्त संदेश अब आपके द्वारा निर्दिष्ट समय सीमा के लिए अदृश्य है (डिफ़ॉल्ट: 30 सेकंड)। उस समय, कोई अन्य पाठक इस कतार संदेश को पुनर्प्राप्त नहीं कर सकता है।

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

    नोट: प्रत्येक CloudQueueMessage में DequeueCount संपत्ति है, इसलिए आप यह निर्धारित कर सकते हैं कि संदेश एक से अधिक बार देखा गया है (और इसलिए आप जहर संदेशों से भी निपट सकते हैं)।

    +0

    काम नहीं करेगा एक मामूली स्पष्टीकरण - अंतिम पॉप रसीद का मालिक केवल एक ही है जो कतार संदेश को हटा सकता है। इसलिए, यहां तक ​​कि इस मामले में कि एक संदेश फिर से 'दृश्यमान' हो गया था, फिर भी इसे मूल पाठक द्वारा तब तक हटाया जा सकता था जब तक कि इसे अंतराल में डी-कतारबद्ध नहीं किया गया था (जो एक नई पॉप रसीद उत्पन्न करेगा)। – dunnry

    0

    CloudFX में प्राथमिकInstanceManager क्लास है जिसका उपयोग इन परिदृश्यों में से कुछ के लिए किया जा सकता है।