Troppi eventi non necessari

3

Sono nuovo per le app gestite dagli eventi e dall'inizio ho un problema che non so come risolvere.

Lavoro nell'e-commerce e cerco sempre di trasmettere eventi significativi ai miei aggregati come PriceIncreasedEvent , ProductDeactivatedEvent , OutOfStockEvent ecc.

Ma molte volte voglio solo fare un semplice stile "CRUD" con il mio aggregato. Ad esempio, l'utente può modificare l'immagine del prodotto, ma non voglio confondere il mio aggregato con ImageUploadedEvent event, poiché non fa parte del dominio che dovrebbe gestire.

Tutto quello che voglio fare è semplicemente impostare il nuovo percorso dell'immagine nel database. Ma dal momento che le "proiezioni" dovrebbero essere usa e getta, non posso farlo perché perderei informazioni.

Questo accade spesso con altri tipi di dati editoriali, come il titolo / nome di qualcosa. Non voglio creare un evento TitleChanged , so che è un odore di codice, non importa per il dominio che TitleChanged . Voglio solo cambiarlo.

Forse l'eventourcing era una cattiva idea? Come gestite questi tipi di scenari?

    
posta lucaswxp 29.05.2018 - 05:32
fonte

4 risposte

2

Non hai bisogno di eventi, a meno che non ti servano i vantaggi offerti da un evento.

Ecco i vantaggi offerti da un evento:

  1. Notifica asincrona
  2. Il disaccoppiamento
  3. Adatto per applicazioni o strumenti il cui flusso di controllo è basato, non sulla sua struttura, ma piuttosto su eventi interni o esterni (in particolare GUI).
  4. Architettura fondamentale per le code di messaggi.

Inoltre, l'event sourcing (potenzialmente) fornisce:

  1. Ricostruisci stato
  2. Query temporali
  3. Riproduzione dell'evento

Hai bisogno di quelle cose (per un dato elemento nella tua architettura)? Se non lo fai, allora non hai bisogno di un evento (per quel particolare elemento).

Ulteriori letture
Event Sourcing (Fowler)

    
risposta data 29.05.2018 - 17:47
fonte
1

Sembra che tu abbia due domini.

Un dominio è ad es. dati del prodotto. È basato sull'evento perché tieni a mente cosa cita @ robert-harvey.

Un altro dominio è qualcosa di più fugace, per il quale non ti interessa la cronologia, la replica, il controllo, ecc., ma vuoi comunque mantenere lo stato più recente. Se si dispone di un dominio di questo tipo, memorizza efficacemente nella cache una proiezione dal dominio generato da eventi; se è lì, lo usa, in caso contrario, dovrebbe attivare il suo ricalcolo e attendere che si completi.

È probabile che nel tuo caso particolare tu abbia ancora un singolo dominio. Se gestivo un negozio (e ne ho), sarei profondamente interessato alla storia dei cambiamenti delle immagini dei prodotti e alla sua relazione con i cambiamenti di prezzo e di descrizione. Pertanto, ProductImageUploadedEvent appartiene probabilmente al dominio generato da eventi e dovrebbe contenere un numero di metainfo sufficiente a scoprire quale immagine fosse.

    
risposta data 29.05.2018 - 19:05
fonte
1

Sento che non stai distinguendo la differenza tra un'architettura basata su eventi e l'event sourcing. In un evento EDA, gli eventi vengono creati da una sorgente di eventi (UI, API o interna all'app) e gestiti dal processore degli eventi, spesso determinando una modifica a una radice di aggregazione. Questi eventi possono o non possono essere mantenuti a seconda del loro significato. Questo tipo di evento sembra essere quello di cui stai parlando quando un utente aggiorna la propria immagine e l'evento potrebbe essere ImageUpdateRequestedEvent.

Event Sourcing è quando TUTTE le modifiche allo stato sono mantenute in modo che lo stato corrente di un aggregato possa essere determinato esclusivamente dagli eventi registrati. Immagina di avere un server con memoria illimitata, garantito non fallire e una potenza di elaborazione illimitata. In questo caso non ti preoccupare di mantenere i dati in un database. Mantieni tutti gli eventi in memoria che hanno interessato un certo aggregato e li unisci tutti per ottenere lo stato corrente. In questo caso, se non hai salvato quell'evento di modifica dell'immagine, l'aggiornamento all'aggregato andrebbe perso.

Questo è ciò che intendono dire si dice che "le proiezioni sono usa e getta". Sono usa e getta perché hai salvato tutte le azioni che riguardano lo stato dei dati, sia in un DB (dato che non siamo ancora in quel mondo informatico perfetto) o in un evento.

Vedi Martin Fowler dove dice (enfasi il mio) "L'idea fondamentale di Event Sourcing è quella di garantire che ogni passaggio allo stato di un'applicazione venga catturato in un oggetto evento e che questi eventi gli oggetti sono memorizzati nella sequenza in cui sono stati applicati per la stessa durata dello stato dell'applicazione stesso. "

Se stai davvero facendo il sourcing di eventi, devi salvare l'evento di aggiornamento dell'immagine. Se stai davvero facendo un'architettura Event Driven in cui salvi alcuni eventi perché potrebbero essere utili in futuro, puoi semplicemente aggiornare il DB e perdere l'evento di aggiornamento delle immagini senza ripercussioni.

    
risposta data 30.05.2018 - 00:16
fonte
0

Hmmmm Penso che potresti aver fuso i tuoi eventi EventSource e i tuoi eventi di dominio, anche se non è chiaro al 100%.

di avere un oggetto: (scusate l'approccio di sourcing di eventi approssimativo e pronto)

Item
{
    Price {
        get: { return _price;}
        set: { 
            eventSourceEvents.Add(new EditEvent("price",value)); //generic eventsource event
            if(_price > value) { this.isDiscount = true; }  //domain event
            _price = value;}
        }
}

Ora, quando imposto il prezzo, l''evento' del dominio di controllo viene attivato (l'ho ridotto da un gestore di eventi, da un mediatore o da qualsiasi altra cosa per l'esempio) E l'evento di sourcing dell'evento è memorizzato

Ma questo non è il mio evento EventSource

EventSourceRepo 
{
    SaveItem(Item item)
    {
        foreach(Event in item.eventSourceEvents) { //store the event};
    }

    GetItem(string id)
    {
        Item i = new Item();
        foreach(var e in db.GetEventsForId(id))
        {
            //playback events
            if(e.key == "price") { i.Price = e.value;}
        }
    }
}
    
risposta data 29.05.2018 - 13:23
fonte

Leggi altre domande sui tag