Compartilhar via


Provedores de consistência de log

O pacote Microsoft.Orleans.EventSourcing inclui vários provedores de consistência de log que abrangem cenários básicos adequados para começar e permitem alguma extensibilidade.

Armazenamento de estado

O Orleans.EventSourcing.StateStorage.LogConsistencyProvider armazena instantâneos de estado de granularidade, usando um provedor de armazenamento padrão que pode ser configurado de forma independente.

Os dados que são mantidos no armazenamento são um objeto que contém o estado de granularidade (conforme especificado pelo primeiro parâmetro de tipo para JournaledGrain) e alguns metadados (o número da versão e uma marca especial usada para evitar a duplicação de eventos quando os acessos de armazenamento falham).

Como todo o estado de granularidade é lido/gravado toda vez que acessamos o armazenamento, esse provedor não é adequado para objetos cujo estado de granularidade é muito grande.

Esse provedor não dá suporte a RetrieveConfirmedEvents, ele não pode recuperar os eventos do armazenamento porque os eventos não são persistidos.

Armazenamento de log

O Orleans.EventSourcing.LogStorage.LogConsistencyProvider armazena a sequência de eventos completa como um único objeto, usando um provedor de armazenamento padrão que pode ser configurado independentemente.

Os dados mantidos no armazenamento são um objeto que contém um List<EventType> object e alguns metadados (uma marca especial usada para evitar a duplicação de eventos quando os acessos de armazenamento falham).

Esse provedor dá suporte a RetrieveConfirmedEvents. Todos os eventos estão sempre disponíveis e mantidos na memória.

Como toda a sequência de eventos é lida/gravada toda vez que acessamos o armazenamento, esse provedor não é adequado para uso em produção, a menos que as sequências de eventos tenham a garantia de permanecer muito curtas. A principal finalidade desse provedor é ilustrar a semântica do fornecimento de eventos e para ambientes de amostra/teste.

Armazenamento personalizado

Este Orleans.EventSourcing.CustomStorage.LogConsistencyProvider permite que o desenvolvedor conecte sua interface de armazenamento, que é então chamada pelo protocolo de consistência em horários apropriados. Esse provedor não faz suposições específicas sobre se o que é armazenado são instantâneos de estado ou eventos - o programador assume o controle sobre essa escolha (e pode armazenar um ou ambos).

Para usar esse provedor, uma granularidade deve derivar de JournaledGrain<TGrainState,TEventBase>, como antes, mas também deve implementar a seguinte interface:

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

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

O provedor de consistência espera que eles se comportem de uma certa maneira. Os programadores devem estar cientes de que:

  • Espera-se que o primeiro método, ReadStateFromStorage, retorne a leitura de versão e de estado. Se ainda não houver nada armazenado, ele deverá retornar zero para a versão e um estado correspondente ao construtor padrão para StateType.

  • ApplyUpdatesToStorage deve retornar false se a versão esperada não corresponder à versão real (isso é análogo a uma verificação de marca eletrônica).

  • Se ApplyUpdatesToStorage falhar com uma exceção, o provedor de consistência tentará novamente. Isso significa que alguns eventos podem ser duplicados se essa exceção for gerada, mas o evento foi persistido. O desenvolvedor é responsável por garantir que isso seja seguro: por exemplo, evite esse caso não lançando uma exceção ou verifique se os eventos duplicados são inofensivos para a lógica do aplicativo ou adicione algum mecanismo extra para filtrar duplicatas.

Esse provedor não dá suporte a RetrieveConfirmedEvents. É claro que, como o desenvolvedor controla a interface de armazenamento de qualquer maneira, ele não precisa chamar isso em primeiro lugar, mas pode implementar sua recuperação de evento.