2012-03-15 9 views
8

एक संदर्भ में जहां आप कई उदाहरणों पर वेब भूमिका निभा रहे हैं और एक कार्य को शेड्यूल करने की आवश्यकता है जो केवल एक उदाहरण द्वारा किया जाना चाहिए (जैसे साइट पर एक ईमेल भेजना कुछ आंकड़ों के साथ व्यवस्थापक), कार्य को केवल एक उदाहरण पर चलाने के लिए RoleEnvironment.CurrentRoleInstance.Id का उपयोग करना कितना विश्वसनीय है (जैसे आईडी को IN_0 के साथ समाप्त होने पर ही इसे चलाने के लिए)? अगर किसी ने कभी यह किया है, तो मुझे उनकी प्रतिक्रिया में दिलचस्पी होगी।केवल एक उदाहरण में एक कार्य चलाने के लिए CurrentRoleInstance.Id का उपयोग

उत्तर

10

मैं उदाहरण आईडी का उपयोग नहीं होगा से कार्य decoupling की तरह, कुछ अधिक काम की आवश्यकता हो सकती। क्या होता है यदि इंस्टेंस 0 रीबूट हो जाता है (जो प्रति माह कम से कम एक बार होता है)? अब आपका शेड्यूलर या टास्क-रनर ऑफलाइन है।

एक वैकल्पिक समाधान उदाहरणों को फैलाने वाले म्यूटेक्स के प्रकार का उपयोग करना है। जिसकी मैं सोच रहा हूं वह एक ब्लॉब पट्टा है। आप वास्तव में लिखने के लिए एक ब्लॉब पर लीज प्राप्त कर सकते हैं (और केवल एक पट्टा धारक हो सकता है)। आप कार्य चलाने से पहले ब्लॉब लीज प्राप्त करने का प्रयास कर सकते हैं। यदि आप इसे प्राप्त करते हैं, तो कार्य चलाएं। यदि आप नहीं करते हैं, तो इसे न चलाएं।

थोड़ा सा बदलाव: एक थ्रेड में (मान लें कि Run() विधि से शुरू किया गया है), लीज हासिल करने का प्रयास करें और यदि सफल हो, तो शेड्यूलर कार्य (शायद एक थ्रेड या कुछ) लॉन्च करें। यदि आप पट्टा हासिल नहीं कर सकते हैं, तो एक मिनट के लिए सो जाओ और पुनः प्रयास करें। आखिरकार, पट्टे के साथ उदाहरण रिबूट किया जाएगा (या यह किसी अन्य कारण से गायब हो जाएगा)। कुछ सेकंड के बाद, एक और उदाहरण त्याग किए गए पट्टे को हासिल करेगा और एक नया शेड्यूलर कार्य शुरू करेगा।

स्टीव मार्क्स ने पट्टे का उपयोग करके समेकन के बारे में blog post लिखा। टायलर डोर्क्सन के पास पट्टे के बारे में good post भी है।

+0

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

+1

मेरा मुद्दा यह है कि आप हमेशा शेड्यूलर चलाना चाहते हैं। यदि आप किसी विशिष्ट उदाहरण पर निर्भर करते हैं, तो आपको डाउनटाइम होने की गारंटी है। इसके अलावा: यदि आप * नीचे * स्केल करते हैं तो क्या होता है? आप निर्दिष्ट नहीं कर सकते कि कौन सा उदाहरण निकालना है।क्या होता है यदि हटाया गया उदाहरण वह है जिसे आप हर समय संदर्भित करते हैं? –

+0

सच है। मैं उस ब्लॉब लीज विकल्प को लागू करूंगा। धन्यवाद। – ThomasWeiss

0

निष्पादन कोड का कुछ ब्लॉक केवल एक बार चलाया जा सकता है यदि आपके पास कई उदाहरण हैं, उदाहरण के लिए वर्तमान भूमिका उदाहरण की आईडी की जांच कर रहे हैं।

आप अन्य समाधान के साथ एक ही परिणाम प्राप्त कर सकते थे, लेकिन उन अपने उदाहरण

5

हाँ आप InstanceID अगर specificaly

<Startup> 
    <Task commandLine="StartUpTasks\WindowService\InstallWindowService.bat" executionContext="elevated" taskType="background" > 
    <Environment> 
    <Variable name="InstanceId"> 
     <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/@id"/> 
    </Variable> 
    </Environment> 
    </Task> 
</Startup> 

जरूरत उपयोग कर सकते हैं यह रूप

<deployment Id>.<Application Name>.<Role Name>_IN_<index> 
Example mostly MyRole_IN_0, MyRole_IN_1 

इस

%InstanceId% 

तरह पहुँच बैच फ़ाइल में environmet चर निम्न में से हो जाएगा आप इंस्टेंस आईडी से इंडेक्स प्राप्त करने के लिए तो गन्ना फिर से substring या _ की अंतिम अनुक्रमणिका का उपयोग करें। यदि इस उदाहरण में इंडेक्स 0 है तो रीबूट के बाद भी वही अनुक्रमणिका होगी।

अधिक जानकारी http://blogs.msdn.com/b/cclayton/archive/2012/05/17/windows-azure-start-up-tasks-part-2.aspx

http://msdn.microsoft.com/en-us/library/windowsazure/hh404006.aspx

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