2016-09-01 8 views
6

Ich verwende AKKA.NET in meinem aktuellen .NET-Projekt.Wiederholen/Wiederholen fehlgeschlagener Nachrichten in AKKA

Meine Frage ist: Wie können erfahrene AKKA-Entwickler das Replay-Message-on-Failure-Muster mit den neuesten AKKA-Bibliotheken für Java oder .NET implementieren?

Hier sind einige weitere Details.

Ich möchte sicherstellen, dass eine fehlgeschlagene Nachricht (d. H. Eine Nachricht, die von einem Akteur empfangen wird, der zu einer Ausnahme führt) mehrmals mit einem Zeitintervall wiederholt wird. Normalerweise wird der Akteur neu gestartet, indem die fehlgeschlagene Nachricht weggeworfen wird.

Ich habe meine eigene kleine Helfer-Methode so geschrieben, es zu lösen:

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

nun in der Regel meine Schauspieler wie folgt aussehen:

Receive<SomeMessage>(msg => 
     { 

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

ich die obige Lösung gefällt, weil es einfach ist. Allerdings mag ich nicht, dass es in meinem Code noch eine weitere Ebene der Indirektion hinzufügt, und der Code wird ein bisschen unordentlicher, wenn ich diese Hilfsmethode an vielen Stellen verwende. Außerdem hat es einige Einschränkungen. Zunächst einmal wird die Anzahl der Wiederholungen nicht von der Hilfsmethode bestimmt. Es wird von der Aufsichtsstrategie des Supervisors geregelt, die ich für chaotisch halte. Außerdem ist das Zeitintervall fest, während ich in manchen Fällen ein Zeitintervall bevorzugen würde, das für jeden erneuten Versuch zunimmt.

Ich würde etwas bevorzugen, das mit HOCON konfiguriert werden kann. Oder etwas, das als Querdenkmal angewendet werden kann.

Ich kann verschiedene Vorschläge für entweder AKKA für Scala, AKKA für Java und AKKA.NET sehen. Ich habe Beispiele mit Routern gesehen, Beispiele mit Circuit Breaker (z.B. http://getakka.net/docs/CircuitBreaker#examples) und so weiter. Ich habe auch einige Beispiele gesehen, die dieselbe Idee wie oben verwenden. Aber ich habe das Gefühl, dass es noch einfacher sein sollte. Vielleicht beinhaltet dies einen gewissen Gebrauch von AKKA Persistence und Events.

Also meine Frage wiederholen: Wie setzen erfahrene AKKA-Entwickler das Replay-Message-on-Failure-Muster mit den neuesten AKKA-Bibliotheken für Java oder .NET um?

+0

Wie dies zu tun Retry/replay im Falle einer fehlgeschlagenen Nachricht in Java mit akka.Wenn jemand weiß, bitte helfen. –

Antwort

2

ich in diesem letzten Jahr sah irgendwann - ich bin von meiner Dev-Maschine entfernt, so kann nicht überprüfen, so dass dies alles aus dem Gedächtnis kommt:

ich scheinen, um die Lösung dieses Problems zu erinnern, war eine Kombination aus stashing und Aufsicht Strategien und Lifecycle-Haken :)

ich denke Sie Ihr Kind Schauspieler Code in einem try-catch-wickeln kann, dann im Fehlerfall, bunkern die Nachricht und wieder werfen die Ausnahme, so dass es durch die Handhabung Supervisor und alle üblichen Überwachungsstrategien ins Spiel kommen. I denke, würden Sie lieber fortsetzen als neu starten. Dann in der entsprechenden Lifecycle-Nachricht (onresume ?!) stash Nachrichten, was bedeutet, dass die fehlgeschlagene Nachricht erneut verarbeitet wird.

Nun ist dies gar nicht so verschieden von dem, was Sie bereits oben geschrieben, hoffentlich hat jemand eine bessere Lösung :)

+0

Thx, zumindest weiß ich, dass andere Leute zu einem ähnlichen Schluss gekommen sind wie ich. –

+0

@NikolaSchou Ich stehe vor dem gleichen Problem. Können Sie mich auf einen Beispielcode hinweisen, den ich untersuchen kann? Ich bin neu in Akka/Scala. Brauche also ein wenig Hilfe. Vielen Dank. –

+0

Nun @SomBhattacharyya Sie können grundsätzlich den Code, den ich oben geschrieben habe, so wie es tatsächlich funktioniert, wie es sollte. Ich frage nur, ob andere Leute zu anderen Lösungen gekommen sind als ich. –

0

Diese spät sein kann. Eine andere Lösung besteht jedoch darin, den comondnd (oder die essentiellen Parameter) an den actor-Konstruktor zu übergeben und den Befehl an isef zu senden, wenn er erstellt wird, und die Anweisung Restart zu verwenden.

Verwandte Themen