# Event Store

### Java User Group — 23 février 2016

Thibaud Dauce

## Domain Driven Design

#### La conception doit mettre l'accent sur le domaine

#### créer un utilisateur != inscription d'un client

Conférence de Cyrille Martraire à Codeurs en Seine 2015

## Command Query Responsibility Segregation

#### Séparation des requêtes sur les données et des modifications des données

Conférence de Eric et Sébastian Le Merdy à Codeurs en Seine 2015

## Event Sourcing

#### Stocker l'état de l'application comme une succession d'événements

Article de Martin Fowler sur l'Event Sourcing

## Qu'est-ce qu'un événement ?

#### Une simple structure de données

    public final class ArticleWasPublished {

        private UUID articleId;
        private UUID publisherId;

        public ArticleWasPublished (UUID articleId, UUID publisherId) {
            this.articleId = articleId;
            this.publisherId = publisherId;
        }

        public UUID getArticleId() { return this.articleId; }

        public UUID getPublisherId() { return this.publisherId; }
    }

## Exemple de modèle évènementiel

### vos comptes en banque

Date | Compte | Libellé | Changement
--- | --- | --- | ---
20/02/2016 | 042 | Remboursement | +20€
12/02/2016 | 042 | Facture | -20€
08/02/2016 | 042 | Courses | -12€
06/02/2016 | 042 | Virement initial | 100€

## Avantages

- Utilisation du langage du domaine pour les évènements
- Modifications explicites, pas de perte d'information
- Mise à l'échelle très facile car système en ajout-seulement

## Problème

#### Comment connaître le solde à un instant t ?

#### Obligation de recalculer à chaque fois = coûteux en temps

## Solution

#### Mettre en place du cache ou des snapshots

## Architecture type