Delen via


Providers voor logboekconsistentie

Het Microsoft.Orleans.EventSourcing pakket bevat verschillende providers voor logboekconsistentie die betrekking hebben op basisscenario's die geschikt zijn om aan de slag te gaan en enige uitbreidbaarheid mogelijk te maken.

Statusopslag

De Orleans.EventSourcing.StateStorage.LogConsistencyProvider momentopnamen van de graanstatus worden opgeslagen met behulp van een standaardopslagprovider die onafhankelijk kan worden geconfigureerd.

De gegevens die in de opslag worden bewaard, zijn een object dat zowel de korrelstatus bevat (zoals opgegeven door de eerste parameter van het type ) JournaledGrainals sommige metagegevens (het versienummer en een speciale tag die wordt gebruikt om duplicatie van gebeurtenissen te voorkomen wanneer opslagtoegang mislukt).

Omdat de volledige korrelstatus wordt gelezen/geschreven telkens wanneer we toegang hebben tot opslag, is deze provider niet geschikt voor objecten waarvan de graanstatus erg groot is.

Deze provider biedt geen ondersteuning RetrieveConfirmedEventsvoor het ophalen van de gebeurtenissen uit de opslag omdat de gebeurtenissen niet behouden blijven.

Logboekopslag

De Orleans.EventSourcing.LogStorage.LogConsistencyProvider volledige gebeurtenisreeks wordt opgeslagen als één object, met behulp van een standaardopslagprovider die onafhankelijk kan worden geconfigureerd.

De gegevens die in de opslag worden bewaard, zijn een object dat een List<EventType> objecten sommige metagegevens bevat (een speciale tag die wordt gebruikt om duplicatie van gebeurtenissen te voorkomen wanneer opslagtoegang mislukt).

Deze provider biedt wel ondersteuning RetrieveConfirmedEventsvoor . Alle gebeurtenissen zijn altijd beschikbaar en worden in het geheugen bewaard.

Omdat de hele gebeurtenisreeks wordt gelezen/geschreven telkens wanneer we toegang hebben tot opslag, is deze provider niet geschikt voor gebruik in productie, tenzij de gebeurtenisreeksen gegarandeerd vrij kort blijven. Het belangrijkste doel van deze provider is om de semantiek van de gebeurtenisbronnen te illustreren en voor voorbeelden/testomgevingen.

Aangepaste opslag

Hierdoor Orleans.EventSourcing.CustomStorage.LogConsistencyProvider kan de ontwikkelaar hun opslaginterface aansluiten, die vervolgens op de juiste momenten door het consistentieprotocol wordt aangeroepen. Deze provider maakt geen specifieke veronderstellingen over of wat is opgeslagen statusmomentopnamen of gebeurtenissen zijn. De programmeur neemt de controle over die keuze (en kan een of beide opslaan).

Als u deze provider wilt gebruiken, moet een graan worden afgeleid van JournaledGrain<TGrainState,TEventBase>, zoals voorheen, maar moet ook de volgende interface worden geïmplementeerd:

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

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

De consistentieprovider verwacht dat deze zich op een bepaalde manier gedragen. Programmeurs moeten zich ervan bewust zijn dat:

  • De eerste methode, ReadStateFromStoragewordt verwacht dat deze zowel de versie als de status lezen retourneert. Als er nog niets is opgeslagen, moet deze nul retourneren voor de versie en een status die overeenkomt met de standaardconstructor voor StateType.

  • ApplyUpdatesToStorage moet onwaar retourneren als de verwachte versie niet overeenkomt met de werkelijke versie (dit is vergelijkbaar met een e-tagcontrole).

  • Als ApplyUpdatesToStorage dit mislukt met een uitzondering, probeert de consistentieprovider opnieuw. Dit betekent dat sommige gebeurtenissen kunnen worden gedupliceerd als een dergelijke uitzondering wordt gegenereerd, maar de gebeurtenis is behouden. De ontwikkelaar is verantwoordelijk om ervoor te zorgen dat dit veilig is: vermijd dit geval bijvoorbeeld door geen uitzondering te genereren of ervoor te zorgen dat dubbele gebeurtenissen ongevaarlijk zijn voor de toepassingslogica, of voeg een extra mechanisme toe om duplicaten te filteren.

Deze provider biedt geen ondersteuning RetrieveConfirmedEventsvoor . Omdat de ontwikkelaar de opslaginterface toch beheert, hoeven ze dit niet in de eerste plaats aan te roepen, maar kunnen ze hun gebeurtenis ophalen implementeren.