2016-07-11 11 views
10

मेरे पास एक अक्का.NET क्लस्टर है जिसमें लाइटहाउस बीज नोड और दो अन्य नोड्स अभिनेता सिस्टम चला रहे हैं। जब मैं अपने क्लस्टर नोड्स में से एक पर एक सुंदर शट डाउन करने का प्रयास करता हूं, तो मैं देखना चाहता हूं कि कम से कम एक अन्य नोड्स नोड छोड़ने के बारे में एक संदेश देखता है और सभी क्लस्टर नोड्स अंततः नोड्स की सूची के छोड़ने वाले नोड को बाहर कर देते हैं।Akka.NET क्लस्टर नोड सुन्दर शट डाउन

एक बार है कि ध्यान रखा गया है की मुझे लगता है मैं बंद दो अन्य नोड कि बंद करने के लिए कनेक्ट करने में सक्षम नहीं होने के बारे पागल जा रहा नोड्स के बिना अभिनेता प्रणाली में सक्षम होना चाहिए उम्मीद ...

मेरे पास है क्या अभी एक कंसोल आवेदन एक TopShelf आवेदन में लपेटा जाता है:

class ActorService : ServiceControl 
{ 
    private ActorSystem _actorSystem; 

    public bool Start(HostControl hostControl) 
    { 
     _actorSystem = ActorSystem.Create("myActorSystem"); 

     var cluster = Cluster.Get(_actorSystem); 
     cluster.RegisterOnMemberRemoved(_Terminate); 

     return true; 
    } 

    public bool Stop(HostControl hostControl) 
    { 
     var cluster = Cluster.Get(_actorSystem); 
     cluster.Leave(cluster.SelfAddress); 
     return true; 
    } 

    private void _Terminate() 
    { 
     _actorSystem.Terminate(); 
    } 
} 

यहाँ मेरी मुख्य है:

class Program 
{ 
    static int Main(string[] args) 
    { 
     return (int) HostFactory.Run(x => 
     { 
      x.UseAssemblyInfoForServiceInfo(); 
      x.RunAsLocalSystem(); 
      x.StartAutomatically(); 
      x.Service<ActorService>(); 
      x.EnableServiceRecovery(r => r.RestartService(1)); 
     }); 
    } 
} 

जब बंद करो समारोह के माध्यम से कदम, मैं अन्य नोड्स पर छोड़ने वाले नोड के बारे में कोई प्राप्त संदेश नहीं देख सकता। जब फ़ंक्शन रिटर्न करता है, तो अन्य नोड्स अपवादों को स्पॉटिंग शुरू करते हैं।

Akka.NET Gitter चैनल में एक उपयोगकर्ता ने कहा:

मैं webhost समाप्त होने के बाद एक शुद्ध ASP.NET कोर परियोजना के साथ, एक ही बात भी TopShelf बिना मुझे कहना पड़ेगा देखा है।

+0

क्या आप अन्य नोड्स पर जो अपवाद देख रहे हैं उसे पोस्ट कर सकते हैं? – Aaronontheweb

+0

जैसा कि मैं एएसपी.नेट कोर वेबहोस्ट के साथ ऐसा कर रहा हूं, मैं इन अपवादों को देख सकता हूं: 'System.Net.Sockets.SocketException (0x80004005) के साथ 'त्रुटि पकड़ा गया चैनल' के साथ शुरू होता है: I/O ऑपरेशन निरस्त कर दिया गया है क्योंकि या तो थ्रेड निकास या एक आवेदन अनुरोध'। फिर दो मृत पत्र जिन्हें 'अलग' संदेश वितरित नहीं किए गए हैं। फिर 'Akka.Remote.ShutDownAssociation:' Akka.Remote.Transport.InvalidAssociationException के साथ पता बंद करें ': रिमोट सिस्टम ने एसोसिएशन को समाप्त कर दिया क्योंकि यह बंद हो रहा है। अधिक मृत पत्रों का पालन करें। – ZoolWay

+0

यह 'अमान्य वर्गीकरण' का उत्पादन जारी रखेगा क्योंकि यह अंतहीन रूप से शटडाउन नोड से पुनः कनेक्ट करने का प्रयास करता है जिसे क्लस्टर छोड़ दिया जाना चाहिए था। – ZoolWay

उत्तर

12

मुझे लगता है कि समस्या यह है कि छोड़ने से पहले Stop() विधि पूर्ण हो जाती है। आपको सदस्य ईवेंट के लिए प्रतीक्षा करनी चाहिए।

यह Stop() विधि सदस्य तक पहुंचने तक प्रतीक्षा करेगा कॉलबैक को बुलाया गया है और संकेत दिया गया है कि उसने अभिनेता प्रणाली को भी समाप्त कर दिया है।

class Worker 
{ 
    private static readonly ManualResetEvent asTerminatedEvent = new ManualResetEvent(false); 
    private ActorSystem actorSystem; 

    public void Start() 
    { 
     this.actorSystem = ActorSystem.Create("sample"); 
    } 

    public void Stop() 
    { 
     var cluster = Akka.Cluster.Cluster.Get(actorSystem); 
     cluster.RegisterOnMemberRemoved(() => MemberRemoved(actorSystem)); 
     cluster.Leave(cluster.SelfAddress); 

     asTerminatedEvent.WaitOne(); 
     //log.Info("Actor system terminated, exiting"); 
    } 

    private async void MemberRemoved(ActorSystem actorSystem) 
    { 
     await actorSystem.Terminate(); 
     asTerminatedEvent.Set(); 
    } 

} 

नोट: मैंने बिना किसी समस्या के क्लस्टर को छोड़ने के लिए तीन प्रकार के ऐप्स की जांच की। मैंने GitHub पर होस्ट किया है। छोड़ने पर कुछ अपवाद और कुछ मृत अक्षर अभी भी हैं, लेकिन अन्य नोड्स अब निरंतर नोड से पुनः कनेक्ट करने का प्रयास नहीं करते हैं।

+0

एक आकर्षण की तरह काम किया - धन्यवाद! – yonsk

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