Sdílet prostřednictvím


Zprostředkovatelé konzistence protokolů

Balíček Microsoft.Orleans.EventSourcing obsahuje několik poskytovatelů konzistence protokolů, kteří pokrývají základní scénáře vhodné pro začátek a umožňují určitou rozšiřitelnost.

State Storage

Ukládá Orleans.EventSourcing.StateStorage.LogConsistencyProvider snímky stavu zrnitosti pomocí standardního zprostředkovatele úložiště, který lze konfigurovat nezávisle.

Data uložená v úložišti jsou objekt, který obsahuje jak stav agregace (jak je specifikováno prvním parametrem typu) JournaledGraintak i některá metadata (číslo verze a speciální značka, která se používá k zabránění duplicitě událostí, když dojde k selhání přístupu k úložišti).

Vzhledem k tomu, že se při každém přístupu k úložišti čte a zapisuje celý stav zrnitosti, není tento zprostředkovatel vhodný pro objekty, jejichž stav zrnitosti je velmi velký.

Tento zprostředkovatel nepodporuje RetrieveConfirmedEvents, nemůže načíst události z úložiště, protože události nejsou trvalé.

Úložiště protokolů

Uloží Orleans.EventSourcing.LogStorage.LogConsistencyProvider kompletní sekvenci událostí jako jeden objekt pomocí standardního zprostředkovatele úložiště, který lze konfigurovat nezávisle.

Data, která jsou uložena v úložišti, jsou objekt, který obsahuje List<EventType> object, a některé meta-data (speciální značka, která se používá k zabránění duplikaci událostí při selhání přístupu k úložišti).

Tento poskytovatel podporuje RetrieveConfirmedEvents. Všechny události jsou vždy dostupné a uchovávané v paměti.

Vzhledem k tomu, že se celá sekvence událostí čte a zapisuje při každém přístupu k úložišti, není tento poskytovatel vhodný pro použití v produkčním prostředí, pokud není zaručeno, že sekvence událostí zůstanou poměrně krátké. Hlavním účelem tohoto poskytovatele je ilustrovat sémantiku modelu Event Sourcing a pro ukázky/testovací prostředí.

Vlastní úložiště

Vývojář Orleans.EventSourcing.CustomStorage.LogConsistencyProvider tak může připojit své rozhraní úložiště, které se pak v příslušné době volá protokolem konzistence. Tento poskytovatel nepředkládá konkrétní předpoklady o tom, jestli jsou uložené snímky stavu nebo události – programátor předpokládá kontrolu nad touto volbou (a může uložit buď nebo obojí).

Chcete-li použít tohoto zprostředkovatele, musí se odvodit JournaledGrain<TGrainState,TEventBase>od , jako předtím, ale navíc musí také implementovat následující rozhraní:

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

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

Poskytovatel konzistence očekává, že se budou chovat určitým způsobem. Programátoři by měli vědět, že:

  • Očekává se, ReadStateFromStorageže první metoda vrátí verzi i stav čtení. Pokud ještě není nic uložené, měl by vrátit nulu pro verzi a stav, který odpovídá výchozímu konstruktoru pro StateType.

  • ApplyUpdatesToStorage musí vrátit hodnotu false, pokud očekávaná verze neodpovídá skutečné verzi (je to analogické ke kontrole e-značek).

  • Pokud ApplyUpdatesToStorage dojde k chybě s výjimkou, zprostředkovatel konzistence se opakuje. To znamená, že některé události mohou být duplikovány, pokud je taková výjimka vyvolána, ale událost byla zachována. Vývojář zodpovídá za zajištění, že je to bezpečné: např. vyhnete se tomuto případu tak, že nevyvolá výjimku, nebo zajistíte, aby duplicitní události byly pro logiku aplikace neškodné, nebo přidejte další mechanismus pro filtrování duplicit.

Tento poskytovatel nepodporuje RetrieveConfirmedEvents. Samozřejmě, protože vývojář řídí rozhraní úložiště, nemusí volat na prvním místě, ale může implementovat načítání událostí.