Wie geht man mit Split-Brain um?

8

Ich habe in Orleans FAQ gelesen, wenn Split-Brain passieren könnte, aber ich verstehe nicht, was schlecht passieren kann und wie man richtig damit umgeht.

FAQ sagt etwas vage wie:

  

Sie müssen nur die seltene Möglichkeit berücksichtigen, zwei Instanzen eines Akteurs zu haben, während Sie Ihre Anwendung schreiben.

Aber wie sollte ich das wirklich in Betracht ziehen und was kann passieren, wenn ich es nicht tue?

Orleans Paper ( Ссылка ) sagt dies:

>
  

-Anwendung kann auf externe persistent zugreifen   Speicher für eine bessere Datenkonsistenz

Aber ich verstehe nicht, was das bedeutet.

Angenommen, Split Brain passiert ist. Jetzt habe ich zwei Instanzen von einem Korn. Wenn ich ein paar Nachrichten sende, könnten sie von diesen beiden (oder es könnten noch mehr sein?) Verschiedenen Instanzen empfangen werden. Angenommen, jede Instanz vor dem Empfang dieser Nachrichten hatte denselben Zustand. Nach der Verarbeitung dieser Nachrichten haben sie nun verschiedene Zustände.

Wie sollten sie ihre Staaten beibehalten? Es könnte einen Konflikt geben.

Wenn andere Instanzen zerstört werden und nur einer übrig bleiben wird, was mit den Zuständen zerstörter Instanzen geschehen wird? Es wird sein, dass die von ihnen verarbeiteten Nachrichten noch nie verarbeitet wurden? Dann könnte der Client-Status und der Server-Status IIUC desynchronisiert werden.

Ich sehe das (Split-Brain) als ein großes Problem und ich verstehe nicht, warum es so wenig Aufmerksamkeit darauf gibt.

    
bobby 07.02.2016, 01:53
quelle

1 Antwort

7

Orleans nutzt die Konsistenzgarantien des Speicheranbieters. Wenn Sie this.WriteStateAsync() von einem Grain aufrufen, stellt der Speicheranbieter sicher, dass das Korn alle vorherigen Schreibvorgänge gesehen hat. Wenn dies nicht der Fall ist, wird eine Ausnahme ausgelöst. Sie können diese Ausnahme abfangen und DeactivateOnIdle() aufrufen und die Ausnahme erneut ausführen oder ReadStateAsync() aufrufen und es erneut versuchen. Wenn Sie also 2 Grains während eines Split-Brain-Szenarios haben, verhindert das WriteStateAsync() zuerst, dass der andere den Status schreibt, ohne zuerst den aktuellsten Status gelesen zu haben.

Update: Beginnend in Orleans v1.5.0 , ein Korn, das ein InconsistentStateException erlaubt zurückgeworfen werden, wird automatisch deaktiviert, wenn die aktuell ausgeführten Anrufe abgeschlossen sind. Ein Korn kann catch enthalten und die Ausnahme behandeln, um eine automatische Deaktivierung zu vermeiden.

    
Reuben Bond 07.02.2016, 02:43
quelle

Tags und Links