Freigeben über


Protokollkonsistenzanbieter

Das Microsoft.Orleans.EventSourcing Paket enthält mehrere Protokollkonsistenzanbieter, die grundlegende Szenarien abdecken, die für die ersten Schritte geeignet sind und eine Erweiterung ermöglichen.

Statusspeicher

Der Orleans.EventSourcing.StateStorage.LogConsistencyProvider speichert Getreidezustands-Schnappschüsse mithilfe eines Standardspeicheranbieters, den Sie unabhängig konfigurieren können.

Die im Speicher gespeicherten Daten sind ein Objekt, das sowohl den Kornzustand (angegeben durch den ersten Typparameter JournaledGrain) als auch einige Metadaten (die Versionsnummer und ein spezielles Tag enthält, das verwendet wird, um Ereignisduplizierung zu vermeiden, wenn Speicherzugriffe fehlschlagen).

Da der gesamte Kornzustand jedes Mal gelesen/geschrieben wird, wenn auf den Speicher zugegriffen wird, eignet sich dieser Anbieter nicht für Objekte mit sehr großen Kornzuständen.

Dieser Anbieter unterstützt RetrieveConfirmedEventsnicht . Ereignisse können nicht aus dem Speicher abgerufen werden, da die Ereignisse nicht beibehalten werden.

Protokollspeicher

Die Orleans.EventSourcing.LogStorage.LogConsistencyProvidervollständige Ereignissequenz wird als einzelnes Objekt mithilfe eines Standardspeicheranbieters gespeichert, den Sie unabhängig konfigurieren können.

Die im Speicher gespeicherten Daten sind ein Objekt, das ein List<EventType> Objekt und einige Metadaten enthält (ein spezielles Tag, das verwendet wird, um Ereignisduplizierung zu vermeiden, wenn Speicherzugriffe fehlschlagen).

Dieser Anbieter unterstützt RetrieveConfirmedEvents. Alle Ereignisse sind immer verfügbar und im Arbeitsspeicher gespeichert.

Da die gesamte Ereignissequenz jedes Mal gelesen/geschrieben wird, wenn auf den Speicher zugegriffen wird, eignet sich dieser Anbieter nicht für die Produktionsverwendung , es sei denn, die Ereignissequenzen bleiben garantiert relativ kurz. Der Hauptzweck dieses Anbieters besteht darin, die Semantik der Ereignisbeschaffung zu veranschaulichen und in Beispiel-/Testumgebungen zu verwenden.

Benutzerdefinierter Speicher

Auf diese Orleans.EventSourcing.CustomStorage.LogConsistencyProvider Weise können Sie Die Speicherschnittstelle anschließen, die das Konsistenzprotokoll dann zu geeigneten Zeiten aufruft. Dieser Anbieter macht keine spezifischen Annahmen darüber, ob die gespeicherten Daten aus Zustandsmomentaufnahmen oder Ereignissen bestehen – Sie übernehmen die Kontrolle über diese Wahl (und können entweder oder beide speichern).

Um diesen Anbieter zu verwenden, muss ein Korn wie zuvor von JournaledGrain<TGrainState,TEventBase> abgeleitet werden, muss aber auch die folgende Schnittstelle implementieren:

public interface ICustomStorageInterface<StateType, EventType>
{
    Task<KeyValuePair<int, StateType>> ReadStateFromStorage();

    Task<bool> ApplyUpdatesToStorage(
        IReadOnlyList<EventType> updates,
        int expectedVersion);
}

Der Konsistenzanbieter erwartet, dass sich diese Methoden auf eine bestimmte Weise verhalten. Beachten Sie Folgendes:

  • Die erste Methode ReadStateFromStorage wird voraussichtlich sowohl die Version als auch den Zustand zurückgeben. Wenn noch nichts gespeichert wird, sollte für die Version null und ein Zustand zurückgegeben werden, der dem Standardkonstruktor entspricht StateType.

  • ApplyUpdatesToStorage muss false zurückgeben, wenn die erwartete Version nicht mit der tatsächlichen Version übereinstimmt. Dies ähnelt einer E-Tag-Überprüfung.

  • Wenn ApplyUpdatesToStorage mit einer Ausnahme fehlschlägt, versucht es der Konsistenzanbieter erneut. Dies bedeutet, dass einige Ereignisse dupliziert werden können, wenn eine solche Ausnahme ausgelöst wird, aber das Ereignis beibehalten wurde. Sie sind dafür verantwortlich, dass dies sicher ist: Vermeiden Sie z. B. diesen Fall, indem Sie keine Ausnahme auslösen, sicherstellen, dass duplizierte Ereignisse für die Anwendungslogik harmlos sind, oder fügen Sie einen zusätzlichen Mechanismus zum Filtern von Duplikaten hinzu.

Dieser Anbieter unterstützt RetrieveConfirmedEventsnicht . Da Sie die Speicherschnittstelle jedoch trotzdem steuern, müssen Sie diese Methode nicht zuerst aufrufen, sondern ihre Ereignisabruflogik implementieren.