2016-02-07 11 views
8

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

FAQ sagt etwas vage wie:

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

Aber wie eigentlich sollte ich dies berücksichtigen und was kann passieren, wenn ich nicht werde?

Orleans Papier (http://research.microsoft.com/pubs/210931/Orleans-MSR-TR-2014-41.pdf) sagt dazu:

Anwendung externer persistent Speicher verlassen können stärkere Datenkonsistenz

bereitzustellen 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önnen sie von diesen beiden (oder es können 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 Zustände beibehalten? Es könnte einen Konflikt geben.

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

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

Antwort

7

Orleans nutzt die Konsistenzgarantien des Speicheranbieters. Wenn Sie this.WriteStateAsync() von einem Korn 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 auslösen oder ReadStateAsync() aufrufen und es erneut versuchen. Wenn Sie also zwei Grains während eines Split-Brain-Szenarios haben, verhindert das erste, das Sie anrufen, WriteStateAsync(), dass der andere zuerst den Status schreiben kann, ohne zuvor den aktuellsten Status gelesen zu haben.

Update: Ab Orleans v1.5.0 wird ein Grain, das es einem InconsistentStateException ermöglicht, zum Aufrufer zurückgeworfen zu werden, automatisch deaktiviert, wenn die gerade ausgeführten Aufrufe abgeschlossen sind. Ein Korn kann catch und behandelt die Ausnahme, um automatische Deaktivierung zu vermeiden.

+2

Ist es wahr, dass "eine Ausnahme ausgelöst wird und Orleans den Status liest, bevor der Korn die nächste Nachricht verarbeiten kann" Wie ich sehe, wird InconsistentStateException vom Framework nicht behandelt. – lmagyar

+2

@LaszloMagyar Ihr Verdacht ist richtig. Ich habe https://github.com/dotnet/orleans/issues/1420 geöffnet und die Antwort korrigiert. Danke :) –

+0

Das deckt immer noch nicht das Szenario ab, in dem ein Korn schreibgeschützte Nachrichten empfängt und das zweite Nachrichten liest/schreibt - das erstere antwortet mit veralteten Daten. –

Verwandte Themen