AKKA

2016-09-01 8 views
6

में असफल संदेशों का पुनः प्रयास/पुन: चलाएं मैं अपने वर्तमान .NET प्रोजेक्ट में AKKA.NET का उपयोग कर रहा हूं।AKKA

मेरा प्रश्न यह है: जावा या .NET के लिए नवीनतम AKKA पुस्तकालयों का उपयोग करके एकेके-डेवलपर्स को रीप्ले-संदेश-ऑन-विफलता पैटर्न को कैसे कार्यान्वित किया जाता है?

यहां कुछ और विवरण दिए गए हैं।

मैं यह सुनिश्चित करना चाहता हूं कि एक असफल संदेश (यानी एक अभिनेता द्वारा प्राप्त अपवाद के लिए प्राप्त संदेश) प्रत्येक के बीच एक समय अंतराल के साथ कई बार फिर से चलाया/पुनः प्रयास किया जाता है। आम तौर पर असफल संदेश से अभिनेता को फिर से शुरू किया जाता है।

मैं इस तरह अपने ही छोटे सहायक विधि इसे हल करने में लिखा है:

public void WithRetries(int noSeconds, IUntypedActorContext context, IActorRef receiver, IActorRef sender, Object message, Action action) 
    { 
      try 
      { 
       action(); 
      } 
      catch (Exception e) 
      { 
       context.System.Scheduler.ScheduleTellOnce(new TimeSpan(0, 0, noSeconds), receiver, message, sender); 
       throw; 
      } 
     } 
    } 

अब मेरी अभिनेताओं आम तौर पर इस तरह दिखेगा:

Receive<SomeMessage>(msg => 
     { 

      ActorHelper.Instance.WithRetries(-1, Context, Self, Sender, msg,() =>  { 
       ...here comes the actual message processing 
      }); 
     }); 

मैं ऊपर समाधान चाहते क्योंकि यह सरल है। हालांकि, मुझे यह पसंद नहीं है कि यह मेरे कोड में संकेत की एक और परत जोड़ता है, और अगर मैं कई जगहों पर इस सहायक विधि का उपयोग करता हूं तो कोड थोड़ा और गन्दा हो जाता है। इसके अलावा इसमें कुछ सीमाएं हैं। सबसे पहले, पुनः प्रयासों की संख्या सहायक विधि द्वारा शासित नहीं होती है। यह पर्यवेक्षक की पर्यवेक्षण रणनीति द्वारा शासित है, जो मुझे विश्वास है कि गन्दा है। इसके अलावा, समय अंतराल तय किया गया है, जबकि मैं कुछ मामलों में एक समय अंतराल की तरह होगा जो प्रत्येक पुनः प्रयास के लिए बढ़ता है।

मैं कुछ ऐसा पसंद करूंगा जिसे HOCON का उपयोग करके कॉन्फ़िगर किया जा सके। या कुछ ऐसा जो क्रॉस-चिंता के रूप में लागू किया जा सकता है।

मैं स्कैला के लिए AKKA, जावा के लिए AKKA और AKKA.NET के लिए विभिन्न सुझाव देख सकता हूं। मैंने राउटर के साथ उदाहरण देखा है, सर्किट ब्रेकर के साथ उदाहरण (उदा। http://getakka.net/docs/CircuitBreaker#examples) और बहुत आगे। मैंने उपरोक्त के समान विचार का उपयोग करके कुछ उदाहरण भी देखे हैं। लेकिन मुझे एहसास है कि यह भी आसान होना चाहिए। शायद इसमें AKKA दृढ़ता और घटनाओं का कुछ उपयोग शामिल है।

तो मेरा प्रश्न दोहराने के लिए: जावा या .NET के लिए नवीनतम AKKA पुस्तकालयों का उपयोग करके एकेके-डेवलपर्स को रीप्ले-संदेश-ऑन-विफलता पैटर्न को कैसे कार्यान्वित किया जाता है?

+0

यह कैसे करें अक्का के साथ जावा में असफल संदेश के मामले में पुनः प्रयास/पुनः चलाएं। अगर कोई जानता है तो कृपया मदद करें। –

उत्तर

2

मैं कुछ देर इस पिछले साल में देखा - मैं अपने देव मशीन से दूर हूं इसलिए जांच नहीं कर सकता, तो यह सब स्मृति से आ रही है:

मैं इस का हल याद करने लगते हैं stashing का एक संयोजन था और पर्यवेक्षण रणनीतियों और जीवन चक्र हुक :)

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

अब यह सब है कि क्या आप पहले से ही ऊपर पोस्ट किया है से अलग नहीं है, इसलिए उम्मीद है कोई एक बेहतर समाधान :)

+0

Thx, कम से कम मुझे पता है कि अन्य लोग मेरे जैसे ही निष्कर्ष पर आए। –

+0

@ निकोलास्चौ मुझे एक ही समस्या का सामना करना पड़ रहा है। क्या आप मुझे कुछ उदाहरण कोड पर इंगित कर सकते हैं जिसे मैं देख सकता हूं। मैं अक्का/स्कैला के लिए नया हूँ। तो थोड़ी मदद की ज़रूरत है। धन्यवाद। –

+0

खैर @ सोमबट्टाचार्य्य आप मूल रूप से उस कोड को ले सकते हैं जिसे मैंने ऊपर लिखा था क्योंकि यह वास्तव में काम करता है जैसा कि इसे करना चाहिए। मैं केवल यह पूछ रहा हूं कि अन्य लोग मुझसे अलग समाधान के लिए आए हैं या नहीं। –

0

यह देर से हो सकता है है। लेकिन एक और समाधान कॉममेंड (या आवश्यक पैरा) को अभिनेता कन्स्ट्रक्टर को पास करना है और Restart निर्देश का उपयोग करते समय आइसलेफ़ को कमांड भेजना है।

// Scala code 
class ResilientActor(cmd:Comman) extends Actor { 
    def receive = { 
    ... 
    } 
    self ! cmd 
} 

... 

override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 3){ 
    case _: SomeRetryableException => Restart 
    case t => super.supervisorStrategy.decider.applyOrElse(t, (_:Any) => Escalate) 
} 
संबंधित मुद्दे