2015-04-22 7 views
12

मुझे 4 कार्यकर्ता भूमिकाओं के साथ क्लाउड सेवा परिनियोजन मिला, जिसमें से एक ऑटो-स्केलिंग सक्षम हो गया। जैसे ही ऑटो-स्केलिंग होती है, सभी भूमिकाओं के सभी उदाहरण रीसाइक्लिंग होते हैं।Azure क्लाउड सेवा भूमिका के उदाहरण - ऑटो-स्केलिंग - ईवेंट को फायरिंग

आदर्श रूप में, मैं रीसाइक्लिंग से भूमिकाओं को रोकना चाहता हूं या कम से कम नियंत्रित भूमिका में अन्य सभी भूमिकाओं के काम को समाप्त करना चाहता हूं।

मुझे पता चला कि आप react to the RoleEnvironment.Changing event कर सकते हैं और इसे एक सुंदर शटडाउन का अनुरोध करने के लिए रद्द कर सकते हैं (यानी ऑनस्टॉप को बुलाया जा रहा है)। हालांकि, चेंजिंग इवेंट हैंडलर में ट्रेसिंग आउटपुट जोड़कर, मैंने देखा कि चेंजिंग इवेंट स्पष्ट रूप से भी नहीं निकाल दिया गया था, इसलिए रद्दीकरण को पंजीकृत नहीं किया जा रहा था।

private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e) 
{ 
    // This tracing output does not show up in the logs table. 
    Trace.TraceInformation("RoleEnvironmentChanging event fired."); 
    if ((e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange))) 
    { 
     // This one neither. 
     Trace.TraceInformation("One of the changes is a RoleEnvironmentConfigurationSettingChange. Cancelling.."); 

     e.Cancel = true; 
    } 
    if ((e.Changes.Any(change => change is RoleEnvironmentTopologyChange))) 
    { 
     // This one neither. 
     Trace.TraceInformation("One of the changes is a RoleEnvironmentTopologyChange. Cancelling."); 

     e.Cancel = true; 
    } 
} 

public override bool OnStart() 
{ 
    // Hook up to the changing event to prevent roles from unnecessarily restarting. 
    RoleEnvironment.Changing += RoleEnvironmentChanging; 

    // Set the maximum number of concurrent connections 
    ServicePointManager.DefaultConnectionLimit = 12; 

    bool result = base.OnStart(); 

    return result; 
} 

इसके अलावा adding an internal endpoint प्रत्येक भूमिका के लिए परिवर्तन नहीं लाए। यहां .csdef से कॉन्फ़िगरेशन:

<WorkerRole name="MyRole" vmsize="Medium"> 
[...ConfigurationSettings...] 
<Endpoints> 
    <InternalEndpoint name="Endpoint1" protocol="http" /> 
</Endpoints> 
</WorkerRole> 

प्रोटोकॉल को "किसी भी" में बदलना सफल नहीं था।

स्केलिंग ऑपरेशन के बाद मैं अपनी भूमिका के उदाहरण रीसाइक्लिंग से कैसे रोक सकता हूं?

संपादित करें:
» शामिल कोड
» फिक्स्ड लिखने की त्रुटियों

उत्तर

-3

भूमिका पर्यावरण के तरीके और घटनाक्रम पांच मुख्य स्थानों पर जहां आप पर्यावरण परिवर्तन करने के लिए प्रतिक्रिया करने के लिए कोड लिख सकते हैं कर रहे हैं टुकड़े। इनमें से दो, ऑनस्टार्ट और ऑनस्टॉप, रोलएन्ट्रीपॉइंट क्लास पर विधियां हैं जिन्हें आप अपनी मुख्य भूमिका कक्षा में ओवरराइड कर सकते हैं (जिसे डिफ़ॉल्ट रूप से वेबरोल या वर्कररोल कहा जाता है)। अन्य तीन रोलएन्वायरमेंट क्लास पर ऐसी घटनाएं हैं जिनकी आप सदस्यता ले सकते हैं: बदलना, बदलना और रोकना।

इन तरीकों के प्रयोजन के लिए उनके नाम से बहुत स्पष्ट है:

OnStart gets called when the instance is first started. 
Changing gets called when something about the role environment is about to change. 
Changed gets called when something about the role environment has just been changed. 

रोकना कहा जाता हो जाता है जब उदाहरण के बारे में बंद कर दिया जा रहा है। इंस्टेंस बंद होने पर ऑनस्टॉप को कॉल किया जाता है। सभी मामलों में, संबंधित कोड होने से रोकने के लिए आपका कोड कुछ भी नहीं कर सकता है, लेकिन आप जिस तरह से चाहें इसका जवाब दे सकते हैं। बदलती घटना के मामले में, आप यह भी चुन सकते हैं कि e.Cancel = true सेट करके कॉन्फ़िगरेशन परिवर्तन से निपटने के लिए इंस्टेंस को पुनर्नवीनीकरण किया जाना चाहिए या नहीं।

क्यों नहीं बदल रहे हैं और मेरे आवेदन में फायरिंग बदल रहे हैं? जब मैंने पहली बार इस विषय की खोज शुरू कर दी, तो मैंने विंडोज़ एज़ूर कंप्यूट एमुलेटर (जिसे पहले पहले फैब्रिक फैब्रिक के नाम से जाना जाता था) और क्लाउड में निम्नलिखित असामान्य व्यवहार देखा:

बदलते और बदले गए ईवेंट किसी भी उदाहरण पर नहीं फंस गए जब मैंने कॉन्फ़िगरेशन परिवर्तन किए। RoleEnvironment.CurrentRoleInstance.Role.Instances.Count हमेशा 1 लौटा, भले ही भूमिका में कई उदाहरण थे। यह पता चला है कि यह एमएसडीएन आलेख में दस्तावेज किए गए किसी भी आंतरिक अंतराल में परिभाषित होने पर अपेक्षित व्यवहार है। तो समाधान इस तरह से अपनी ServiceDefinition.csdef फ़ाइल में एक आंतरिक endpoint परिभाषित करने के लिए बस है:

<Endpoints> 
    <InternalEndpoint name=”InternalEndpoint1″ protocol=”http” /> 
</Endpoints> 

कौन सा घटनाक्रम आग कहाँ और कब? भले ही घटनाओं के नाम बहुत आत्म-व्याख्यात्मक प्रतीत होते हैं, फिर भी तैनाती को स्केल करते समय सटीक व्यवहार आवश्यक नहीं है जो आप उम्मीद कर सकते हैं। निम्नलिखित चित्र दिखाता है कि एक घटना परिदृश्य में कौन सी घटनाएं आग लगती हैं जिसमें एक ही भूमिका होती है। शुरुआत में 2 उदाहरण तैनात किए जाते हैं, फिर तैनाती को 4 उदाहरणों तक बढ़ाया जाता है, फिर वापस 3 तक, और अंत में तैनाती रोक दी जाती है।

से http://azure.microsoft.com/blog/2011/01/04/responding-to-role-topology-changes/

+2

उत्तर के लिए धन्यवाद। लेकिन केवल एक वेबसाइट की प्रतिलिपि बनाना जो मैंने अपने प्रश्न में भी शामिल किया और कहा कि यह काम नहीं करता है, मेरे लिए बहुत उपयोगी नहीं है, क्षमा करें! कोई अन्य विचार क्यों यह मेरे लिए काम नहीं करता है? –

2

आप निम्न में से एक का प्रयास किया था ले लिया?

  • चेक कि क्या घटना भूमिका के उदाहरण हैं जिनमें ऑटो स्केलिंग है में निकाल दिया जा रहा है
  • (सुनिश्चित करें कि आंतरिक endpoint के साथ अपने नहीं एक समस्या बनाने के लिए) एक पूर्ण फिर से तैनाती (अद्यतन के बजाय) करो ।
  • इवेंट हैंडलर में ट्रेसिंग आउटपुट के बाद एक छोटा थ्रेड (नींद) जोड़ें (कभी-कभी ट्रेस आउटपुट पंजीकृत होने से पहले भूमिका बंद हो जाती है)
  • प्रबंधन पोर्टल के माध्यम से कॉन्फ़िगरेशन में से किसी एक में बदलाव करें (और यह देखना होगा कि ईवेंट को ट्रिगर करने जा रहा है)
  • चेक अन्य घटनाओं (उदाहरण के RoleEnvironment.Changed के लिए) निकाल दिया है कि क्या किया जा रहा है
+1

इन संकेतों के लिए धन्यवाद, पॉल। दुर्भाग्य से इनमें से कोई भी मेरे लिए सफलता लाया। यही कारण है कि मैं आपके उत्तर को स्वीकार नहीं करूँगा क्योंकि यह अन्य उपयोगकर्ताओं को गुमराह कर सकता है। हालांकि, चूंकि आपके उत्तर ने सहायता प्रदान करने में सबसे अधिक प्रयास दिखाए हैं, इसलिए मैं आपको बक्षीस दूंगा। अगर आपको और विचार मिलते हैं, तो कृपया मुझे बताएं! –

+1

थैक्स बेंजामिन। बहुत बुरा है कि मैं आपकी मदद नहीं कर सका ... –

0

वाह, 2 साल से अधिक w/वास्तविक जवाब यहाँ oa। बहुत बुरा। विषय के साथ मेरा अनुभव है: ई। कैंसल को गलत पर सेट करें यदि आपका उदाहरण पुन: कॉन्फ़िगर किए जाने के बिना स्केलिंग के बाद और काम करने में सक्षम है।

if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)){ 
Trace.WriteLine("with recycle"); 
e.Cancel = true; 
} 
else { 
Trace.WriteLine("without recycle"); 
e.Cancel = false; 
} 

शायद आप ऑनस्टार्ट पर Trace.AutoFlush = true सेट करना चाहते हैं।

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