Partilhar via


Provedores de consistência de log

O Microsoft.Orleans.EventSourcing pacote 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 grão, usando um provedor de armazenamento padrão que pode ser configurado independentemente.

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

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

Este provedor não suporta RetrieveConfirmedEvents, ele não pode recuperar os eventos do armazenamento porque os eventos não são persistentes.

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 pode ser configurado independentemente.

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

Este provedor suporta o RetrieveConfirmedEvents. Todos os eventos estão sempre disponíveis e guardados 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 permaneçam muito curtas. O principal objetivo deste provedor é ilustrar a semântica do fornecimento de eventos e para amostras/ambientes de teste.

Armazenamento personalizado

Isso Orleans.EventSourcing.CustomStorage.LogConsistencyProvider permite que o desenvolvedor conecte sua interface de armazenamento, que é chamada pelo protocolo de consistência nos momentos apropriados. Este 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, um grão deve derivar de JournaledGrain<TGrainState,TEventBase>, como antes, mas adicionalmente 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 determinada maneira. Os programadores devem estar cientes de que:

  • Espera-se que o primeiro método, ReadStateFromStorage, retorne a versão e o estado lido. Se não houver nada armazenado ainda, ele deve retornar zero para a versão, e um estado que corresponde 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 tenta. Isso significa que alguns eventos podem ser duplicados se tal exceção for lançada, mas o evento foi persistente. O desenvolvedor é responsável por garantir que isso seja seguro: por exemplo, evite esse caso não lançando uma exceção, ou garanta que eventos duplicados sejam inofensivos para a lógica do aplicativo, ou adicione algum mecanismo extra para filtrar duplicatas.

Este provedor não suporta RetrieveConfirmedEvents. Claro, 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 eventos.