Event sourcing: ricerca di aggregati per proprietà diverse da ID

4

Esistono meccanismi o best practice per la ricerca di aggregati per proprietà diverse rispetto all'ID aggregato?

Cercherò di spiegare la mia domanda sull'esempio.

C'è un aggregato Carrello (origine evento) e Prodotto . Esiste una regola che quando il business annulla la vendita di Prodotto , deve "scomparire" da ogni carrello aggregato.

Come posso trovare carrelli con prodotti specifici all'interno senza ricostruire tutti gli aggregati Carrello ?

Ho pensato di utilizzare il modello di lettura per scoprire quali carrelli contengono prodotti specifici e quindi utilizzare i loro ID al comando.

    
posta František Maša 29.07.2015 - 14:24
fonte

1 risposta

7

Potresti usare un indice. In genere questo non è qualcosa che troverai in un eventstore, quindi molto probabilmente dovrai utilizzare un motore di indicizzazione esterno per questo.

Questo indice dovrebbe quindi essere aggiornato ogni volta che qualcuno cambia un contenuto di carrelli e questo aggiornamento dell'indice sarebbe molto probabilmente asincrono. Ciò significherebbe che non puoi fare affidamento sul tuo indice per essere corretto al 100%. Quindi quello che potresti fare nel tuo caso è:

  1. Il prodotto viene cancellato
  2. Effettua una ricerca dell'indice per i carrelli contenenti il prodotto
  3. Rileva le rimozioni di prodotti per questi carrelli

Ora, potresti avere ancora carrelli contenenti il prodotto annullato, poiché potresti avere modifiche al carrello che non sono ancora state indicizzate. Questo è ok, è inevitabile, non combatterlo - abbracciarlo

Con la ricerca dell'indice probabilmente avrai gestito la maggior parte del problema. Ma potresti avere ancora alcuni ritardatari.

Quello che devi fare ora è gestire il caso quando un cliente controlla un carrello che contiene un prodotto annullato. A questo punto, puoi rimuovere silenziosamente i prodotti annullati o mostrare un messaggio che questo prodotto non è disponibile, ecc. Ciò dovrebbe risolvere anche altri problemi.

Naturalmente, come è il problema con la maggior parte dei sistemi alla fine coerenti, potresti comunque finire con alcuni clienti che riescono effettivamente ad acquistare un prodotto annullato. In questo caso, molto probabilmente lo noterai in una fase successiva (come quando stai impacchettando l'ordine). In tal caso, emettere un evento di correzione che a sua volta dovrebbe rimborsare il cliente e inviare una e-mail dicendo al cliente che è molto dispiaciuto che il prodotto non sia più disponibile.

Questo può sembrare insicuro e fastidioso, ma siediti, prendi una tazza di caffè e pensaci per un momento. Dovrai comunque gestire questo caso anche se avessi un database completamente coerente.

Nella vita reale quando un prodotto viene annullato probabilmente ricevi un avviso dal venditore. Questo avviso può venire in modo tale che il prodotto è stato effettivamente cancellato 2 giorni fa quando hai ricevuto l'avviso in primo luogo. Quindi, quando inserisci i dati nel sistema che il prodotto non esiste più, potrebbe non essere stato in grado di acquistare per diversi giorni prima. Ma non c'è modo che il tuo sistema possa gestirlo! Quindi dovrai passare attraverso gli ordini ritirati e emettere rimborsi, proprio come afferma il processo sopra.

O forse il prodotto è stato cancellato, ma ne hai lasciato 1 nel tuo magazzino. Eccezionale! Quindi il cliente può comprarlo comunque! Tranne che mentre impacchettate la cosa, i vostri imballatori lo fanno cadere sul pavimento e sono distrutti, o quando i vostri imballatori vanno a prenderlo, vedono che è danneggiato dall'acqua ... o qualsiasi altra cosa veramente. Allora cosa fai? "Mi dispiace, Signor Cliente, ecco il rimborso." Anche se questo è un evento piuttosto raro, succederà prima o poi.

Come avrai notato quando acquisti online, questo ti accadrà a un certo punto o in un altro. Comprerai qualcosa su Amazon, poi un giorno dopo riceverai un "mi dispiace non possiamo davvero farti avere questa cosa - ecco i tuoi soldi indietro" -email. E quando ricevi quella mail, ovviamente ti senti deluso, ma in genere capisci che può succedere e non è proprio colpa di nessuno.

Succederà perché tutte le informazioni sul computer saranno sempre vecchie e obsolete. :) Non puoi progettarlo anche se non stai facendo il processo di eventi, qualsiasi progetto che promette di farlo alla fine fallirà a causa di preoccupazioni nella vita reale (come l'esempio di goffe packers sopra).

Abbracciatelo, pianificatelo, includetelo nei vostri casi d'uso / flussi, scrivete test per questo e avrete un sistema che fallisce con garbo.

(Inoltre, se sei intelligente, quando invii il messaggio "mi dispiace non puoi comprarlo, ecco il rimborso", includi un buono del 10% o qualcosa del genere per il tuo prossimo carrello della spesa nell'e-mail! in questo modo il cliente potrebbe sentirsi incline a tornare al tuo negozio e comprare qualcos'altro.)

    
risposta data 29.07.2015 - 15:43
fonte

Leggi altre domande sui tag