2016-07-11 17 views
10

Ich habe einen Akka.NET-Cluster mit einem Lighthouse Seed-Knoten und zwei anderen Knoten, die Actor-Systeme ausführen. Wenn ich versuche, ein ordnungsgemäßes Herunterfahren auf einem meiner Clusterknoten durchzuführen, möchte ich sehen, dass mindestens einer der anderen Knoten eine Nachricht über den ausgehenden Knoten anzeigt und dass alle Clusterknoten schließlich den ausgehenden Knoten der Knotenliste ausschließen.Akka.NET-Cluster-Knoten ordnungsgemäß Herunterfahren

Sobald das erledigt worden erwarte ich sollte ich der Schauspieler System ohne die beiden anderen Knoten gehen Nüsse über nicht in der Lage ist mit dem Knoten zu verbinden, die nach unten zur Abschaltung der Lage sein, schließen ...

Was ich habe, jetzt eine Konsole-Anwendung in einer Topshelf Anwendung eingewickelt:

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(); 
    } 
} 

Hier ist meine Haupt:

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)); 
     }); 
    } 
} 

Wenn durch die Stop-Funktion treten, Ich kann keine empfangene Nachricht über den Knoten auf den anderen Knoten sehen. Wenn die Funktion jedoch zurückkehrt, beginnen die anderen Knoten mit dem Auslösen von Ausnahmen.

Ein Benutzer in der Akka.NET Gitter Kanal sagte:

ich die gleiche Sache beobachtet haben, auch ohne Topshelf I, mit einem reinen ASP.NET Core-Projekt beendet nach dem Webhost sagen muss.

+0

Könnten Sie bitte die Ausnahmen, die Sie auf den anderen Knoten sehen, posten? – Aaronontheweb

+0

Da ich diese mit ASP.NET Core Webhost habe, kann ich diese Ausnahmen sehen: Beginnt mit 'Error gefangen Kanal' mit 'System.Net.Sockets.SocketException (0x80004005): Die E/A-Operation wurde abgebrochen, weil entweder eines Thread-Exits oder einer Anwendungsanfrage. Dann wurden zwei tote Briefe, die "Dissociated" Nachrichten haben, nicht geliefert. Dann 'AkkA.Remote.ShutDownAssociation: Adresse herunterfahren mit' AkkA.Remote.Transport.InvalidAssociationException: Das entfernte System hat die Verbindung beendet, weil es heruntergefahren wird.' Gefolgt von weiteren toten Buchstaben. – ZoolWay

+0

Es wird weiterhin "InvalidAssociation" erzeugt, weil es dann endlos versucht, sich wieder mit dem Herunterfahrknoten zu verbinden, der den Cluster hätte verlassen sollen. – ZoolWay

Antwort

12

Ich denke, das Problem ist, dass die Stop() Methode abgeschlossen ist, bevor das Verlassen abgeschlossen hat. Sie sollten auf das Ereignis MemberRemoved warten.

Diese Stop() Methode wird warten, bis der MemberRemoved Rückruf aufgerufen wurde und signalisierte, dass es sogar das Aktorsystem beendet hat.

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(); 
    } 

} 

Hinweis: Ich habe nach drei Arten von Apps gesucht, um den Cluster ohne Probleme zu verlassen. Ich habe das auf GitHub gehostet. Es gibt immer noch einige Ausnahmen und ein paar tote Buchstaben beim Verlassen, aber die anderen Knoten versuchen nicht mehr ständig, sich wieder mit dem exitierten Knoten zu verbinden.

+0

Arbeitete wie ein Zauber - Danke! – yonsk

Verwandte Themen