Condividi tramite


Provider di coerenza dei log

Il pacchetto Microsoft.Orleans.EventSourcing include diversi provider di coerenza dei log che coprono scenari di base adatti per iniziare e consentire un'estendibilità.

Archiviazione dello stato

Orleans.EventSourcing.StateStorage.LogConsistencyProvider archivia gli snapshot dello stato granulare, usando un provider di archiviazione standard che può essere configurato in modo indipendente.

I dati mantenuti nell'archiviazione sono un oggetto che contiene sia lo stato di granularità (come specificato dal primo parametro di tipo a JournaledGrain) che alcuni metadati (il numero di versione e un tag speciale usato per evitare la duplicazione degli eventi quando gli accessi all'archiviazione hanno esito negativo).

Poiché l'intero stato di granularità viene letto/scritto ogni volta che si accede all'archiviazione, questo provider non è adatto per gli oggetti il cui stato di granularità è molto grande.

Questo provider non supporta RetrieveConfirmedEvents, non può recuperare gli eventi dall'archiviazione perché gli eventi non sono persistenti.

Archiviazione log

Orleans.EventSourcing.LogStorage.LogConsistencyProvider archivia la sequenza di eventi completa come singolo oggetto, usando un provider di archiviazione standard che può essere configurato in modo indipendente.

I dati conservati nell'archiviazione sono un oggetto che contiene un oggetto List<EventType> object e alcuni metadati (un tag speciale usato per evitare la duplicazione degli eventi quando gli accessi all'archiviazione hanno esito negativo).

Questo provider supporta RetrieveConfirmedEvents. Tutti gli eventi sono sempre disponibili e mantenuti in memoria.

Poiché l'intera sequenza di eventi viene letta/scritta ogni volta che si accede all'archiviazione, questo provider non è adatto per l'uso nell'ambiente di produzione, a meno che le sequenze di eventi non rimangano abbastanza brevi. Lo scopo principale di questo provider è illustrare la semantica dell'origine eventi e per gli ambienti di esempio/test.

Archiviazione personalizzata

Questo Orleans.EventSourcing.CustomStorage.LogConsistencyProvider consente allo sviluppatore di collegare la propria interfaccia di archiviazione, che viene quindi chiamata dal protocollo di coerenza in momenti appropriati. Questo provider non fa ipotesi specifiche sul fatto che ciò che viene archiviato siano snapshot o eventi di stato; è il programmatore che assume il controllo su tale scelta (e può archiviare uno o entrambi).

Per usare questo provider, una granularità deve derivare da JournaledGrain<TGrainState,TEventBase>, come in precedenza, ma deve anche implementare l'interfaccia seguente:

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

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

Il provider di coerenza prevede che si comportino in modo specifico. I programmatori devono tenere presente che:

  • Il primo metodo, ReadStateFromStorage, dovrebbe restituire sia la versione che lo stato letto. Se non è ancora stato archiviato alcun elemento, deve restituire zero per la versione e uno stato corrispondente al costruttore predefinito per StateType.

  • ApplyUpdatesToStorage deve restituire false se la versione prevista non corrisponde alla versione effettiva (è analogo a un controllo di e-tag).

  • Se ApplyUpdatesToStorage ha esito negativo con un'eccezione, il provider di coerenza ritenta. Ciò significa che alcuni eventi potrebbero essere duplicati se viene generata un'eccezione di questo tipo, ma l'evento è stato salvato in modo permanente. Lo sviluppatore è responsabile di assicurarsi che questo sia sicuro: ad esempio, evitare questo caso non generando un'eccezione o assicurarsi che gli eventi duplicati siano innocui per la logica dell'applicazione, o aggiungere un meccanismo aggiuntivo per filtrare i duplicati.

Questo provider non supporta RetrieveConfirmedEvents. Naturalmente, poiché lo sviluppatore controlla comunque l'interfaccia di archiviazione, non è necessario chiamarlo in primo luogo, ma può implementare il recupero degli eventi.