Partager via


Fournisseurs de cohérence des journaux

Le package Microsoft.Orleans.EventSourcing comprend plusieurs fournisseurs de cohérence des journaux qui couvrent les scénarios de base appropriés pour bien démarrer, et permettent une certaine extensibilité.

Stockage d’état

Orleans.EventSourcing.StateStorage.LogConsistencyProvider stocke les captures instantanées d’état de grain à l’aide d’un fournisseur de stockage standard qui peut être configuré indépendamment.

Les données conservées dans le stockage correspondent à un objet qui contient à la fois l’état du grain (spécifié par le premier paramètre de type à JournaledGrain) et des métadonnées (le numéro de version et une étiquette spéciale utilisée pour éviter la duplication des événements en cas d’échec des accès au stockage).

Dans la mesure où l’ensemble de l’état du grain est lu/écrit chaque fois que nous accédons au stockage, ce fournisseur ne convient pas aux objets dont l’état du grain est très volumineux.

Ce fournisseur ne prend pas en charge RetrieveConfirmedEvents, il ne peut pas récupérer les événements provenant du stockage, car ils ne sont pas conservés.

Stockage des journaux

Orleans.EventSourcing.LogStorage.LogConsistencyProvider stocke la séquence d’événements complète sous la forme d’un seul objet, à l’aide d’un fournisseur de stockage standard qui peut être configuré indépendamment.

Les données conservées dans le stockage correspondent à un objet qui contient List<EventType> object et des métadonnées (une étiquette spéciale utilisée pour éviter la duplication des événements en cas d’échec des accès au stockage).

Ce fournisseur prend en charge RetrieveConfirmedEvents. Tous les événements sont toujours disponibles et conservés en mémoire.

Dans la mesure où l’ensemble de la séquence d’événements est lu/écrit chaque fois que nous accédons au stockage, ce fournisseur ne convient pas pour une utilisation en production, à moins d’avoir la garantie que les séquences d’événements restent assez courtes. Ce fournisseur sert à illustrer la sémantique de l’approvisionnement en événements ainsi que les exemples/environnements de test.

Stockage personnalisé

Orleans.EventSourcing.CustomStorage.LogConsistencyProvider permet au développeur de connecter son interface de stockage, qui est ensuite appelée par le protocole de cohérence aux moments appropriés. Ce fournisseur n’établit pas d’hypothèses spécifiques sur le fait de savoir si le stockage est constitué de captures instantanées d’état ou d’événements (le programmeur est responsable de ce choix). Il est possible de stocker l’un de ces types d’élément ou les deux.

Pour utiliser ce fournisseur, un grain doit dériver de JournaledGrain<TGrainState,TEventBase>, comme auparavant, mais il doit également implémenter l’interface suivante :

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

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

Le fournisseur de cohérence s’attend à ce qu’ils se comportent d’une certaine façon. Les programmeurs doivent être bien conscients des aspects suivants :

  • La première méthode, ReadStateFromStorage, est censée retourner à la fois la version et l’état lus. Si rien n’est encore stocké, elle doit retourner zéro pour la version, et un état qui correspond au constructeur par défaut pour StateType.

  • ApplyUpdatesToStorage doit retourner false si la version attendue ne correspond pas à la version réelle (ceci est analogue à une vérification d’étiquette d’entité).

  • En cas d’échec de ApplyUpdatesToStorage avec une exception, le fournisseur de cohérence effectue une nouvelle tentative. Cela signifie que certains événements peuvent être dupliqués si une telle exception est levée, mais que l’événement a été conservé. En tant que développeur, votre responsabilité est de vérifier que cette opération est sécurisée. Par exemple, évitez cette situation en ne levant pas d’exception, vérifiez que les événements dupliqués sont inoffensifs pour la logique de l’application, ou ajoutez un mécanisme supplémentaire pour filtrer les doublons.

Ce fournisseur ne prend pas en charge RetrieveConfirmedEvents. Bien entendu, dans la mesure où le développeur contrôle l’interface de stockage, il n’a pas besoin de l’appeler au départ, mais il peut implémenter la récupération d’événements.