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) JournaledGrain
tak 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í.