2012-01-10 3 views
6

जहां तक ​​मुझे याद है, एक भूमिका उदाहरण स्वचालित रूप से क्रैश/विफलता के बाद पुनरारंभ करना चाहिए। उस व्यवहार का परीक्षण करने के लिए, मैंने एक ऐसा एप्लीकेशन लिखा है जो आउट-ऑफ-मेमोरी-अपवाद लागू करता है और मेरा एप्लिकेशन क्रैश हो जाता है। भूमिका उदाहरण ने पुनरारंभ नहीं किया, क्योंकि यह अभी भी चल रहा था और ठीक है - उदाहरण बस .NET रनटाइम को पुनरारंभ करें।किस प्रकार के अपवाद/क्रैश एक Azure क्लाउड उदाहरण पुनरारंभ करता है?

मैं यह जानने का प्रयास कर रहा हूं कि एक उदाहरण विभिन्न त्रुटियों पर कैसे प्रतिक्रिया करता है। मेरे मामले में, एक पुनरारंभ आवश्यक नहीं था। किस प्रकार की त्रुटियां/अपवाद (जिसे मैं लागू कर सकता हूं) एक उदाहरण के पूर्ण पुनरारंभ का कारण बनता है? किस प्रकार की त्रुटियां/अपवाद हमेशा के लिए एक उदाहरण को मार देंगे?

उत्तर

11

एकमात्र कारण जो भूमिका उदाहरण को पुनर्नवीनीकरण (पुनरारंभ) का कारण बनता है वह तब होता है जब RunRoleEntryPoint निकास का तरीका होता है।

  1. Overrided Run() विधि, और
  2. अपने प्रोग्राम कोड में एक बिना क्रिया का अपवाद है, कि Run() विधि बाहर निकलने के लिए

आपकी भूमिका तथापि रीसायकल होगा कारण होगा: यह आमतौर पर जब आप होता है , लेकिन जब आप IntelliTrace लॉग संग्रह सक्षम करते हैं, तो लटकाएं।

वेबरोल के लिए डिफ़ॉल्ट टेम्पलेट Run() विधि को ओवरराइड नहीं करता है, इस प्रकार डिफ़ॉल्ट कार्यान्वयन को छोड़ देता है, जो "थ्रेड स्लीप (-1);" है। कोई (ऑटो) ईवेंट नहीं है जो वेबरोल की स्वचालित भूमिका रीसाइक्लिंग का कारण बनता है। जब तक आप अपनी RoleEntryPoint में कुछ नहीं करते हैं, तो इससे बाहर निकलने के लिए रन विधि का कारण बनता है। यह स्वचालित रीसाइक्लिंग केवल वर्कररोल के साथ होता है, जो रन() विधि को लागू करता है।

अद्यतन 1

run-Methoded of a RoleEntryPoint faces an error 

सिर्फ एक त्रुटि है, लेकिन त्रुटि इस तरह (अर्थात एक बिना क्रिया का अपवाद) है, जिसकी वजह भागो() विधि बाहर निकलने के लिए (1 टिप्पणी के अनुसार)।

इसके अलावा, आप अपने वेबरोल में रन() को ओवरराइड नहीं कर सकते हैं, क्योंकि आपका रोलएन्ट्रीपॉइंट वंश अलग-अलग ऐप डोमेन (यहां तक ​​कि अलग प्रक्रिया) में रहता है तो आपका वेब एप्लिकेशन (इसलिए इसे आपके एप्लिकेशन के अपवादों के बारे में कोई जानकारी नहीं होगी) । पूर्ण आईआईएस होस्टिंग और प्रक्रिया here के बारे में और पढ़ें।

तो, वेब भूमिका के लिए आपके पास पूरी तरह से आईआईएस 7.0/7.5 में एक वेब एप्लिकेशन है, जिसे यह नहीं पता कि यह आईआईएस एक एज़ूर परिनियोजन का हिस्सा है। Global.asax ASP.NET में अनचाहे वेब एप्लिकेशन त्रुटियों को प्रबंधित करने के लिए आपकी जगह है। this question देखें, जिसका उत्तर Application_Error() हैंडलर के लिए एक अच्छा उदाहरण प्रदान करता है।

आप अपने अनुप्रयोग_इरर() विधि में रोल रीसाइक्लिंग की मैन्युअल रूप से रोल रीसाइक्लिंग की आवश्यकता के लिए RequestRecycle रोलएन्वायरमेंट प्रकार की स्थिर विधि का उपयोग कर सकते हैं। हालांकि ऐसा करने की आपको सलाह नहीं देते हैं। मुझे एप्लिकेशन त्रुटि के कारण वेब सर्वर को पुनरारंभ करने में एक अच्छा अभ्यास नहीं दिख रहा है। आपको अच्छी अपवाद हैंडलिंग और त्रुटि लॉगिंग रणनीति लागू करनी चाहिए, विनियामक आपके त्रुटि लॉग की जांच करें और क्रिटिकल त्रुटियों से बचने के लिए कार्रवाइयां करें जिन्हें सर्वर को पुनरारंभ करने की आवश्यकता होगी।

आपका मूल उद्देश्य क्या है? यह समझने के लिए कि जब कोई भूमिका स्वचालित रूप से पुनर्नवीनीकरण की जाएगी, या आपके एप्लिकेशन को मॉडल करने के लिए जैसे त्रुटि पर आपकी भूमिका स्वचालित रूप से रीसायकल करने के लिए? यदि यह उत्तरार्द्ध है, तो मेरा सुझाव है कि आप अपनी व्यावसायिक आवश्यकताओं/तर्क को संशोधित करें।

अद्यतन 2

मैं नील के मुंह से बात नहीं कर सकते, लेकिन "उदाहरण विफलता" सब कुछ है कि एक चल वीएम लटका पैदा कर सकता है। विंडोज़ एज़ूर में इंस्टेंस एक सिग्नल वर्चुअल मशीन है जो आपके एप्लिकेशन के कोड को होस्ट करता है (होस्टेड सर्विस, रोल, इंस्टेंस पर विस्तृत स्पष्टीकरण के लिए this blog post पढ़ें)। आपका एप्लिकेशन विंडोज सर्वर आधारित ओएस में चलता है। यह एक वर्चुअल मशीन है। कुछ भी हो सकता है - होस्ट पर हार्डवेयर विफलता से, अतिथि ओएस की एक सामान्य सॉफ्टवेयर/ड्राइवर विफलता के लिए। यह आपका कोड होने के लिए आवश्यक नहीं है। तो अगर ऐसा होता है तो एक वीएम विफल हो जाएगा - यह समस्या स्वचालित रूप से विंडोज़ एज़ूर फैब्रिक द्वारा संभाली जाती है। यदि यह निरंतर है - आपका कोड स्वचालित रूप से किसी अन्य आभासी मशीन पर तैनात किया जाता है। और यह स्वचालित रूप से होता है। तुम नहीं कर रहे हो कल्पना करें कि एक एचडीडी ब्रेक, या एक मेमोरी मॉड्यूल जलता है, या नेटवर्क इंटरफ़ेस प्रत्युत्तर देना बंद कर देता है - ये केवल कुछ साधारण समस्याएं हैं जो चल रहे वीएम को विफल कर सकती हैं। यह एक उदाहरण विफलता है।

आपके कोड में विफलता ऐसी चीज है जिसकी आपको देखभाल करनी चाहिए। बाकी सब कुछ - विंडोज़ एज़ूर फैब्रिक कंट्रोलर का ख्याल रखता है।

अद्यतन 3

  1. क्या एक webrole में एक asp.net अनुप्रयोग के लिए होता एक अपवाद तब होता है और यह नहीं संभाला है तो क्या होगा? क्या एप्लिकेशन केवल अपरिभाषित स्थिति ("टूटा हुआ") में लटकाएगा जब तक कि मैं इसे न देखूं या यह vm द्वारा समाप्त हो जाएगा?

यह प्रश्न पूरी तरह से दायरे से बाहर है! साझा होस्टिंग खाते में एएसपीनेट एप्लिकेशन का क्या होता है? या ऑन-प्रिमाइसेस आईआईएस स्थापना में? उस उपयोगकर्ता के लिए एप्लिकेशन क्रैश जिसका कार्य दुर्घटनाग्रस्त हो गया। सबसे खराब केस ऐप पूल रीसायकल। मैंने कभी "लटका" एएसपीनेट एप्लिकेशन नहीं देखा है। "एएसपीनेट एप्लिकेशन समाप्त" या "टूटा हुआ" जैसी कोई चीज़ नहीं है। यदि यह एक सामान्य त्रुटि है जो एप्लिकेशन स्टार्टअप या पहले अनुरोध के दौरान होती है - एप्लिकेशन कभी ऑनलाइन नहीं होगा। यदि यह उपयोगकर्ता क्रियाओं के कुछ अनुक्रमों के कारण त्रुटि है - उपयोगकर्ता को बदसूरत त्रुटि संदेश दिखाई देगा और कुछ भी नहीं (जब तक कि आपके ग्लोबल.एक्सएक्स में उचित एप्लिकेशन_इरर() हैंडलर न हो। मुझे लगता है कि ऐसा करने के लिए कुछ भी नहीं है जिसके लिए कुछ भी नहीं है Azure के साथ।

  1. आप अपने आवेदन में नेट कोड का एक टुकड़ा है कि एक पूरी वेब भूमिका की दुर्घटना का कारण बन सकता बारे में सोच सकते हैं या इसे साथ संभव नहीं है प्रबंधित कोड (.NET में एक अज्ञात बग से अलग)?

आप मजाक कर रहे हैं? इस कोड को अपने वेब भूमिका दुर्घटना और होगा एक रीसाइक्लिंग को मजबूर करेगा:

RoleEnvironment.RequestRecycle() 

कृपया इस प्रश्न को स्वीकार करें, क्योंकि मुझे नहीं लगता कि कुछ गायब है। इसके अलावा इसमें कम से कम 4 और प्रश्न हैं, मूल में जोड़ा गया है।

अंतिम

के रूप में "उदाहरण के हमेशा के लिए मारने के" जैसी कोई चीज नहीं है।

+0

धन्यवाद। मुझे यह समझने में थोड़ी सी समस्या है।आपके अनुसार, यह स्वत: रीसाइक्लिंग और पुनरारंभ करना केवल तभी हो सकता है जब किसी रोलएन्ट्रीपॉइंट के रन-मेथड में कोई त्रुटि हो। क्या इसका मतलब यह है कि एक सामान्य एएसपी.NET अनुप्रयोग, जो वेब भूमिका पर चल रहा है, को विफलता के बाद स्वचालित रूप से पुनरारंभ करने का कोई मौका नहीं है (उदा। एक अनचाहे अपवाद)? मेरा मतलब है कि मैं वैकल्पिक रूप से वेब-भूमिका में रन-विधि को ओवरराइड कर सकता हूं, लेकिन यह बेवकूफ है क्योंकि मेरे एएसपी.NET एप्लिकेशन का कोड इस विधि में नहीं चलता है, या क्या मैं गलत हूं? – ceran

+0

फिर से धन्यवाद। मेरा इरादा सिर्फ समझ है। मुझे नील मैकेंज़ी द्वारा लिखे गए एक लेख के बारे में आश्चर्य है: _ "वेब भूमिकाएं और कार्यकर्ता भूमिका क्रमशः आईआईएस वेबसाइटों और लंबे समय से चल रहे अनुप्रयोगों के लिए एप्लिकेशन-होस्टिंग वातावरण के रूप में कार्य करती हैं। पाएस की शक्ति विंडोज़ एज़ूर द्वारा प्रबंधित भूमिकाओं के जीवन चक्र से आती है एक उदाहरण विफलता की स्थिति में Windows Azure स्वचालित रूप से इंस्टेंस को पुनरारंभ करता है और यदि आवश्यक हो, तो इसे पुन: चलाता है और एक नया VM स्पिन करता है "_। ऐसा लगता है कि सबकुछ आसान और स्वचालित होगा। इस मामले में "उदाहरण विफलता" क्या है? – ceran

+0

आह मैं देखता हूं, चीजें अब स्पष्ट हो रही हैं। 2 प्रश्न शेष हैं: ** 1 **। यदि कोई ऐसा अपवाद होता है जिसे संभाला नहीं जाता है तो वेबोल में एएसपीनेट एप्लिकेशन का क्या होता है? क्या एप्लिकेशन सिर्फ एक अपरिभाषित स्थिति ("टूटा हुआ") में लटकाएगा जब तक कि मैं इसे न देखूं या इसे वीएम द्वारा समाप्त कर दिया जाएगा? ** 2 **। क्या आप मेरे आवेदन में .NET कोड के एक टुकड़े के बारे में सोच सकते हैं जो पूरी वेब भूमिका के दुर्घटना का कारण बन सकता है या यह प्रबंधित कोड (.NET में अज्ञात बग के अलावा) के साथ संभव नहीं है? – ceran

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