Compartilhar via


Provedores de consistência de registro

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

Armazenamento de estado

Orleans.EventSourcing.StateStorage.LogConsistencyProvider armazena instantâneos do estado de grão usando um provedor de armazenamento padrão que você pode configurar de forma independente.

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

Como todo o estado granular é lido/escrito sempre que o armazenamento é acessado, esse provedor não é adequado para objetos com estados granulares muito grandes.

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

Armazenamento de logs

O Orleans.EventSourcing.LogStorage.LogConsistencyProvider armazena a sequência de eventos completa como um único objeto usando um provedor de armazenamento padrão que você pode configurar de forma independente.

Os dados mantidos no armazenamento são um objeto que contém um List<EventType> objeto 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 sempre que o armazenamento é acessado, esse provedor não é adequado para uso em produção , a menos que as sequências de eventos tenham a garantia de permanecer bastante curtas. A principal finalidade desse provedor é ilustrar a semântica do event sourcing e para uso em ambientes de teste/exemplo.

Armazenamento personalizado

Isso Orleans.EventSourcing.CustomStorage.LogConsistencyProvider permite que você conecte sua interface de armazenamento, que o protocolo de consistência chama em momentos apropriados. Esse provedor não faz suposições específicas sobre se os dados armazenados consistem em instantâneos de estado ou eventos – você assume o controle sobre essa escolha (e pode armazenar um ou ambos).

Para usar este provedor, um grão deve derivar de JournaledGrain<TGrainState,TEventBase>, como antes, e 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 esses métodos se comportem de uma determinada maneira. Esteja ciente do seguinte:

  • Espera-se que o primeiro método ReadStateFromStorageretorne a versão e a leitura de estado. Se nada estiver armazenado ainda, 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 e-tag).

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

Esse provedor não dá suporte a RetrieveConfirmedEvents. É claro que, como você controla a interface de armazenamento de qualquer maneira, não precisa chamar esse método em primeiro lugar, mas pode implementar sua lógica de recuperação de eventos.