Wie richte ich akka Actor Fehlertoleranz ein?

8

Ich versuche fehlertolerantes Verhalten in akka Actors zu bekommen. Ich arbeite an Code, der davon abhängt, dass die Akteure im System für eine lange Verarbeitungszeit verfügbar sind. Ich stelle fest, dass meine Verarbeitung nach ein paar Stunden stoppt (es sollte etwa 10 Stunden dauern) und nicht viel passiert. Ich glaube, dass meine Schauspieler sich nicht von Ausnahmen erholen.

Was muss ich tun, damit Schauspieler dauerhaft einzeln gestartet werden? Ich erwarte, dass dies aus dieser Dokumentation Ссылка

gemacht werden kann

Ich arbeite mit akka 1.1.3 und scala 2.9

%Vor%

Dieser Code richtet 5 Actors hinter einem LoadBalancer ein, der Ganzzahlen ausgibt, die an ihn gesendet werden, außer dass Exceptions auf gerade Zahlen geworfen werden, um Fehler zu simulieren. Die Ganzzahlen 0 bis 200 werden an diese Akteure gesendet. Ich erwarte, dass die ungeraden Zahlen ausgegeben werden, aber nach ein paar Fehlern bei geraden Zahlen scheint sich alles abzuschalten. Wenn Sie diesen Code mit sbt ausführen, wird folgende Ausgabe ausgegeben:

%Vor%

Was ich hier denke ist, dass 5 Schauspieler anfangen, und die ersten 5 geraden Zahlen bringen sie aus dem Geschäft und sie werden nicht neu gestartet.

Wie kann dieser Code geändert werden, damit die Actors sich von Ausnahmen erholen?

Ich erwarte, dass dies tatsächlich alle ungeraden Zahlen von 1 bis 200 ausgibt. Ich denke, dass jeder Akteur auf geraden Zahlen scheitern würde, aber mit einem intacted Postfach auf Ausnahmen neugestartet werden würde. Ich erwarte die println von preRestart und postRestart. Was muss in diesem Codebeispiel konfiguriert werden, damit diese Dinge passieren?

Hier sind einige zusätzliche Annahmen über Akka und Schauspieler, die zu meinem Missverständnis führen können. Ich gehe davon aus, dass ein Actor mit einem Supervisor oder einem faultHandler konfiguriert werden kann, so dass er neu gestartet wird und weiterhin verfügbar ist, wenn während des Empfangs eine Ausnahme ausgelöst wird. Ich nehme an, dass die Nachricht, die an den Akteur gesendet wurde, verloren geht, wenn sie während des Empfangs eine Ausnahme auslöst. Ich nehme an, dass preRestart () und postRestart () für den Akteur, der die Ausnahme auslöst, aufgerufen werden.

Das Codebeispiel zeigt, was ich versuche zu tun und basiert auf Warum ist meine Disposition für Schauspieler in Akka reduziert?

** Noch ein Codebeispiel **

Hier ist ein weiteres Codebeispiel, das einfacher ist. Ich beginne einen Schauspieler, der Ausnahmen auf geraden Zahlen wirft. Es gibt keinen Load Balancer oder andere Dinge im Weg. Ich versuche, Informationen über den Schauspieler auszudrucken. Ich warte darauf, das Programm für eine Minute zu verlassen, nachdem die Nachrichten an den Actor gesendet wurden und überwachen, was passiert.

Ich erwarte, dass dies die ungeraden Zahlen ausdrucken würde, aber es sieht so aus, als ob der Schauspieler mit Nachrichten in seiner Mailbox herum sitzt.

Habe ich die OneForOneStrategy falsch eingestellt? Muss ich den Actor mit etwas verbinden? Ist diese Art von Konfiguration von mir grundsätzlich fehlgeleitet? Muss ein Dispatcher mit Fehlertoleranz eingerichtet werden? Wie? Könnte ich die Threads im Dispatcher vermasseln?

%Vor%

Ich bekomme Ausgaben wie:

%Vor%     
Brian C. 16.08.2011, 15:15
quelle

2 Antworten

5

Das Problem war, dass ich mit meiner akka.conf-Datei war. Ich habe die Datei referenz 1.1.3 akka.conf verwendet, mit Ausnahme der Zeile, die die Event-Handler konfiguriert hat.

meiner (der gebrochene):

%Vor%

Referenz 1.1.3 (die eine funktioniert):

%Vor%

Mit meiner Event-Handler Config-Zeile passiert der Actor-Neustart nicht. Mit der Referenz 1.1.3 Line starten die Neustarts wunderbar.

Ich habe diese Änderung basierend auf diesen Anweisungen Ссылка

vorgenommen

Also, indem ich die Vorschläge auf dieser Seite loslasse und auf die Referenz von 1.1.3 akka.conf zurückkomme, konnte ich fehlertolerante Actors bekommen.

    
Brian C. 18.08.2011, 17:55
quelle
1

Ich glaube, Ihr Problem wird beendet, nachdem die Nachrichten gesendet wurden. Sie versuchen nicht, Ihre asynchrone Anwendung am Leben zu erhalten, und so wird der Hauptthread beendet und alles damit erledigt.

    
Viktor Klang 17.08.2011 15:20
quelle

Tags und Links