0
votes

Reconstruire l'état de l'aggrave du point donné à temps en utilisant les CQRS et l'approvisionnement des événements

Supposons que je voudrais obtenir une projection globale d'un point donné à temps et j'utilise l'architecture basée sur les CQRS et l'événement.

En outre, j'ai à la fois lire et écrire une base de données. La première est alimentée par des événements et il y a des projections globales à utiliser par l'interface utilisateur.

Ma question est - Quelle est la meilleure approche pour reconstruire l'état d'agrégat d'un point donné dans une telle architecture, et brièvement comment il devrait ressembler d'un point de vue architectural.

Remarque: je veux renvoyer une telle projection au côté du client.


0 commentaires

3 Réponses :


1
votes

Cela dépend de savoir si vous attendez beaucoup d'événements par agrégat.

Si vous le faites, vous pouvez utiliser des instantanés. Enregistrez l'état d'un agrégat à un moment donné. Ensuite, vous pouvez lire cet instantané et appliquer tous les événements arrivés après l'instantané.

Si vous ne vous attendez pas à beaucoup d'événements, il suffit de lire tous les événements de la mendicité du flux et de reconstruire cet agrégat. Dans ce cas, l'instantané peut rendre les choses plus complext et même des choses ralentissées.

Voici quelques ressources que vous pouvez vérifier:

https://blog.jonathanoliver.com/event-sourcing-and- Instantanés / https://martinfowler.com/eaadev/eventsourcing.html


0 commentaires

0
votes

Si vous avez une architecture d'approvisionnement d'événements, cela signifie que vous stockez déjà votre événement dans un référentiel de magasin d'événements "APPEND-UNIQUEMENT". D'un point de vue de l'architecture, vous devez désérialiser des événements et les appliquer à nouveau (dans la projection de mémoire) pour reconstruire l'état de votre agrégat.

EventStore Interface ressemblerait à quelque chose comme ceci: P>

public abstract class EventSourcedRootEntity {

    private List<DomainEvent> mutatingEvents;
    private int unmutatedVersion;

    public int mutatedVersion() {
        return this.unmutatedVersion() + 1;
    }

    public List<DomainEvent> mutatingEvents() {
        return this.mutatingEvents;
    }

    public int unmutatedVersion() {
        return this.unmutatedVersion;
    }

    protected EventSourcedRootEntity(List<DomainEvent> anEventStream, int aStreamVersion) {

        for (DomainEvent event : anEventStream) {
            this.mutateWhen(event);
        }

        this.setUnmutatedVersion(aStreamVersion);
    }
}


0 commentaires

0
votes

En supposant que le nombre d'événements per-agrégat est petit, vous pouvez répondre à une demande d'un point à temps débutant en streaming les événements pour cet agrégat jusqu'à présent dans une projection en mémoire. Si votre saillie s'appuie uniquement sur des événements d'un type d'agrégat, vous avez effectué simplement la projection. Si vous avez trop d'événements par agrégat pour cela, vous pouvez potentiellement stocker des instantanés périodiques pour chaque projection globale (peut-être tous les 100 événements pour un agrégat particulier, par exemple).

L'attelage est que vous pouvez également avoir besoin d'autres informations dans votre projection, à partir d'autres flux d'événements. Cela le rend plus compliqué. Les options incluent:

  • Fetch Events des autres flux spécifiques qui affectent votre instance de projection particulière, s'il est facile de les travailler, et ils ne sont pas trop gros
  • Utilisez DATOMIC comme magasin d'événement et de projection, car il prend en charge les interrogations et les projections sur le temps du genre, vous pourriez avoir besoin de manière nativement
  • Stockez la projection dans une base de données à l'aide de fonctionnalités temporelles (SQL: 2011?) Ou implémentez la fonction TIME manuellement - lorsqu'une "ligne" change plutôt que de la mise à jour, appendez un nouveau avec un champ pour la plage de temps qu'il est Valide à partir de.
    • Cela fait interrogé très simple et rapide
    • mais nécessite plus de stockage - plutôt qu'un magasin de documents ou similaire, vous devrez peut-être utiliser une structure de base de données normalisée pour la projection avec la scission globale sur plusieurs tables temporelles pour éviter de faire dupliquer trop pour chaque passage à une projection.

0 commentaires