Udostępnij za pośrednictwem


Dostawcy spójności dzienników

Pakiet Microsoft.Orleans.EventSourcing zawiera kilku dostawców spójności dzienników, którzy obejmują podstawowe scenariusze odpowiednie do rozpoczęcia pracy i umożliwiają rozszerzenie.

Magazyn stanu

Migawki Orleans.EventSourcing.StateStorage.LogConsistencyProvider stanu ziarna magazynu są przechowywane przy użyciu standardowego dostawcy magazynu, który można skonfigurować niezależnie.

Dane przechowywane w magazynie to obiekt, który zawiera zarówno stan ziarna (określony przez pierwszy parametr typu do JournaledGrain) i niektóre metadane (numer wersji i specjalny tag, który służy do unikania duplikowania zdarzeń, gdy dostęp do magazynu kończy się niepowodzeniem).

Ponieważ cały stan ziarna jest odczytywany/zapisywany za każdym razem, gdy uzyskujemy dostęp do magazynu, ten dostawca nie jest odpowiedni dla obiektów, których stan ziarna jest bardzo duży.

Ten dostawca nie obsługuje RetrieveConfirmedEventsprogramu , nie może pobrać zdarzeń z magazynu, ponieważ zdarzenia nie są utrwalane.

Magazyn dzienników

Magazynuje Orleans.EventSourcing.LogStorage.LogConsistencyProvider pełną sekwencję zdarzeń jako pojedynczy obiekt przy użyciu standardowego dostawcy magazynu, który można skonfigurować niezależnie.

Dane przechowywane w magazynie są obiektem zawierającym metadane List<EventType> object(specjalny tag używany do unikania duplikowania zdarzeń, gdy dostęp do magazynu kończy się niepowodzeniem).

Ten dostawca obsługuje usługę RetrieveConfirmedEvents. Wszystkie zdarzenia są zawsze dostępne i przechowywane w pamięci.

Ponieważ cała sekwencja zdarzeń jest odczytywana/zapisywana za każdym razem, gdy uzyskujemy dostęp do magazynu, ten dostawca nie jest odpowiedni do użytku w środowisku produkcyjnym, chyba że sekwencje zdarzeń pozostaną dość krótkie. Głównym celem tego dostawcy jest zilustrowanie semantyki określania źródła zdarzeń oraz przykładów/środowisk testowych.

Magazyn niestandardowy

Dzięki temu Orleans.EventSourcing.CustomStorage.LogConsistencyProvider deweloper może podłączyć interfejs magazynu, który jest następnie wywoływany przez protokół spójności w odpowiednim czasie. Ten dostawca nie przyjmuje konkretnych założeń dotyczących tego, czy przechowywane są migawki stanu czy zdarzenia — programista przejmuje kontrolę nad tym wyborem (i może przechowywać oba te migawki).

Aby użyć tego dostawcy, ziarno musi pochodzić z JournaledGrain<TGrainState,TEventBase>klasy , jak poprzednio, ale dodatkowo musi również zaimplementować następujący interfejs:

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

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

Dostawca spójności oczekuje, że będą one zachowywać się w określony sposób. Programiści powinni mieć świadomość, że:

  • Pierwsza metoda, ReadStateFromStorage, oczekuje się, że zwróci zarówno wersję, jak i stan odczytu. Jeśli jeszcze nic nie jest przechowywane, powinien zwrócić zero dla wersji, a stan zgodny z konstruktorem domyślnym dla .StateType

  • ApplyUpdatesToStorage Wartość musi zwracać wartość false, jeśli oczekiwana wersja nie jest zgodna z rzeczywistą wersją (jest to analogia do sprawdzania tagów e-tag).

  • Jeśli ApplyUpdatesToStorage wystąpi błąd z wyjątkiem, dostawca spójności ponawia próbę. Oznacza to, że niektóre zdarzenia mogą zostać zduplikowane, jeśli zostanie zgłoszony taki wyjątek, ale zdarzenie zostało utrwalone. Deweloper jest odpowiedzialny, aby upewnić się, że jest to bezpieczne: np. uniknąć tego przypadku, nie zgłaszając wyjątku, lub upewnij się, że zduplikowane zdarzenia są nieszkodliwe dla logiki aplikacji lub dodaj dodatkowy mechanizm filtrowania duplikatów.

Ten dostawca nie obsługuje RetrieveConfirmedEventsprogramu . Oczywiście, ponieważ deweloper kontroluje mimo to interfejs magazynu, nie musi wywoływać tego w pierwszej kolejności, ale może zaimplementować pobieranie zdarzeń.