2014-05-21 12 views
7

पुनरारंभ करना मैं वर्तमान में अक्का (जावा संस्करण) में फॉल्ट सहिष्णुता और पर्यवेक्षक रणनीतियों को देख रहा हूं।अक्का जावा गलती सहिष्णुता और अभिनेता

पर

... http://doc.akka.io/docs/akka/2.3.2/java/fault-tolerance.html और http://doc.akka.io/docs/akka/2.3.2/general/supervision.html#supervision

कुछ सवाल:

1) हम कभी जब हम जानते हैं कि अपवाद किस तरह की उम्मीद करने की कोशिश हमारे अभिनेताओं में/पकड़ ब्लॉक उपयोग करना चाहिए? क्यों या क्यों नहीं? यदि नहीं, तो क्या हम एक पर्यवेक्षक रणनीति पर निर्भर रहें जो कि बच्चे को फेंकने वाले अपवादों को प्रभावी ढंग से संभालने के लिए किया जाए?

2) डिफ़ॉल्ट रूप से, यदि किसी पर्यवेक्षक को मूल अभिनेता में स्पष्ट रूप से कॉन्फ़िगर नहीं किया गया है, तो ऐसा लगता है कि कोई अपवाद फेंकने वाले किसी भी बच्चे अभिनेता को डिफ़ॉल्ट रूप से पुनरारंभ किया जाएगा। क्या होगा यदि आपके पूरे सिस्टम में आपके कोई भी कलाकार राज्य नहीं लेता है ... क्या हमें वास्तव में पुनरारंभ करना चाहिए?

3) क्या होगा यदि system.actorOf (...) द्वारा बनाए गए आपके शीर्ष-स्तरीय कलाकार अपवाद फेंकता है? आप अभिनेता प्रणाली के बाहर पर्यवेक्षक रणनीति कैसे प्रदान करते हैं?

4) चलिए एक परिदृश्य मानते हैं जिसमें अभिनेता ए के एक बाल अभिनेता बी हैं। अब मान लें कि अभिनेता ए कुछ काम करने के लिए अभिनेता बी से पूछता है।

कुछ कोड इस प्रकार दिखाई देंगे:

Future<Object> future = Patterns.ask(child, message, timeout); 
future.onComplete(new OnComplete<Object>() { 

    @Override 
    public void onComplete(Throwable failure, Object result) throws Throwable { 
      ... handle here  
    } 

अब ... क्या हुआ अगर अभिनेता एक किसी भी तरह एक अपवाद फेंकता है। डिफ़ॉल्ट रूप से इसे अपने पर्यवेक्षक द्वारा पुनरारंभ किया जाता है। सवाल यह है कि, क्या पूर्ण "बंद" अभी भी भविष्य में कभी-कभी निष्पादित हो जाता है, या फिर यह पुनरारंभ पर प्रभावी ढंग से "मिटा दिया जाता है"?

5) मान लीजिए कि मेरे पास पदानुक्रम है जैसे: ए-> बी-> सी। आइए यह भी मान लें कि मैं प्रीरस्टार्ट को ओवरराइड करता हूं ताकि मैं प्रभावी ढंग से अपने बच्चों को नहीं रोकूं। ए की प्रतिष्ठा पर वह getContext()। अभिनेता ओएफ (बी) कहता है, और बी के प्रतिष्ठा में वह getContext()। अभिनेता ओएफ (सी) कहता है। यदि ए अपवाद फेंकता है, तो एक से अधिक अभिनेता बी और एक से अधिक अभिनेता सी सिस्टम में मौजूद होंगे?

धन्यवाद!

उत्तर

6

यह एक बहुत लंबा जवाब होने वाला है, लेकिन मुझे यथासंभव व्यवस्थित रूप से अपने अंक से निपटने दें।
इसके अलावा, मैं आधिकारिक अक्का दस्तावेज पर भरोसा रखूंगा, क्योंकि मेरा मानना ​​है कि अक्का वहां की सबसे अच्छी प्रलेखित परियोजनाओं में से एक है और मैं पहिया को फिर से शुरू नहीं करना चाहता हूं। :)

  1. एक अच्छा परिचय/जिस तरह से दोष सहिष्णुता का अवलोकन अक्का में काम करता है [1] है। मुझे लगता है कि लेख अक्का दस्तावेज़ों के बहुत से पेजों को "बताता है"। विशेष रूप से इस बिंदु पर प्रतिक्रिया देने के लिए, मुझे लगता है कि यह निर्भर करता है: आप try/catch अपवादों को सुनिश्चित कर सकते हैं, लेकिन त्रुटि कर्नेल पैटर्न बताता है कि आपको "अभिनेता पदानुक्रम" को विफल करना चाहिए जो कुछ भी विफल हो सकता है (यह रोकने या सीमित करने के लिए है जितना संभव हो अभिनेताओं के भीतर राज्य का नुकसान)। यह कहा गया है, यदि आपके पास एक बहुत विशिष्ट Exception है और आप जानते हैं कि संदेश की प्रसंस्करण के हिस्से के रूप में इसे कैसे संभालना है, तो मुझे नहीं लगता कि इसे पकड़ने में कोई आंतरिक समस्या है। असल में, मैं कम से कम एक विशिष्ट मामले के बारे में सोच सकता हूं जहां आप अपवादों को पकड़ने और उन्हें संभालने के लिए चाहते हैं: यदि आपका अभिनेता Pattern.ask का जवाब दे रहा है, तो आपको कॉलर को अधिसूचित करने के लिए Failure में अपवाद लपेटने की आवश्यकता है। ([2])।

  2. रूप [3] में कहा गया है, तो डिफ़ॉल्ट रूप वास्तव में Restart है, लेकिन केवल मामले में एक Exception संदेश प्रसंस्करण के दौरान फेंक दिया है। ध्यान दें कि ActorInitializationException और ActorKilledException डिफ़ॉल्ट रूप से बच्चे को समाप्त कर देगा और ध्यान रखें कि ExceptionpreStart के भीतर फेंक दिया जाएगा ActorInitializationException में लपेटा जाएगा। कि क्या Restart के रूप में एक ध्वनि डिफ़ॉल्ट "मामला आप अपने अभिनेताओं में राज्य की जरूरत नहीं है में" है ... अच्छी तरह से, एक अभिनेता है, परिभाषा के द्वारा, एक अमूर्त सुरक्षित रूप से पहुँच सकते हैं और एक समवर्ती वातावरण में राज्य में हेरफेर करने के: यदि आप राज्य नहीं है, शायद आप अभिनेताओं की बजाय Future एस का भी उपयोग कर सकते हैं। सामान्यतः, Restart को सामान्य उपयोग के मामले के लिए एक सुरक्षित और उचित डिफ़ॉल्ट माना जाता था। आपके विशिष्ट मामले में (जो एक अभिनेता प्रणाली के लिए एक सामान्य उपयोग-मामला नहीं है), आप किसी भी तरह से डिफ़ॉल्ट पर्यवेक्षण रणनीति को ओवरराइड कर सकते हैं।

  3. शीर्ष-स्तर के कलाकार केवल "उपयोगकर्ता" दृश्य बिंदु से शीर्ष स्तर पर हैं। के रूप में [4] में बताया गया है, किसी भी शीर्ष स्तर के अभिनेता गार्जियन अभिनेता के एक बच्चे के रूप में बनाई गई है, और यह एक सामान्य डिफ़ॉल्ट पर्यवेक्षण रणनीति है। साथ ही, आप akka.actor.guardian-supervisor-strategy संपत्ति का उपयोग करके ऐसे डिफ़ॉल्ट को संशोधित कर सकते हैं। इसके अलावा, इसलिए बहुत ज्यादा ([6]) शीर्ष स्तर के अभिनेताओं का उपयोग नहीं कर ध्यान रखें कि आप हमेशा आप सिस्टम को ध्यान में अक्का की पदानुक्रमिक प्रवृत्ति ([5]) रखने के लिए डिजाइन चाहिए में रखने के लिए,।

  4. चाहे onComplete के कॉलबैक या बुलाया जाएगा नहीं जब एक विफल रहता है पर निर्भर करता है। यदि यह विफल रहता है के बाद बी पूरी की और एक के अनुरोध का जवाब दिया है, तो यह अमल हो सकता है। अन्यथा यह नहीं होगा। पुराने ए उदाहरण के साथ जब यह "मिटा दिया जाता है"।

  5. इसमें कुछ समय भ्रामक है, लेकिन मुझे लगता है जाएगा निम्नलिखित:

    • जब आप कहते हैं कि "A एक अपवाद फेंकता है", तो आप संदेश प्रसंस्करण के भीतर मतलब (onReceive)
    • आप में एक क्षेत्र है आपका अभिनेता जो getContext().actorOf(C) द्वारा वापस लौटाए गए रेफरी को स्टोर करेगा।

त्वरित जवाब है: हाँ। परिदृश्य आप का वर्णन को देखते हुए, वहाँ B और C के कई उदाहरण हो जाएगा। A का नया उदाहरण हालांकि पता नहीं चलेगा। यह एक संदर्भ नई B को परोक्ष रूप से, नए C है और, होगा। यह उचित है और उम्मीद है, क्योंकि आप मैन्युअल और स्पष्ट अक्षम सफाई तर्क का एक डिफ़ॉल्ट टुकड़ा है कि (postRestart बदलकर) एक अभिनेता के पदानुक्रम में विफलताओं को संभालती है: यह अब सफाई करना आपकी जिम्मेदारी है और preStart कार्यान्वयन आप का वर्णन करता है ऐसा मत करो

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