Abbiamo avuto una discussione su questo argomento sul lavoro non molto tempo fa.
Abbiamo la seguente situazione:
- Un database legacy che è attualmente la base per l'applicazione operativa principale nella nostra azienda.
- Un nuovo sistema di gestione dei contenuti che dovrebbe ricevere informazioni sui dati master dal database citato. I dati master saranno sempre di proprietà del database precedente, ma è necessario nel CMS come base per costruire i propri dati. Potresti pensarlo come categorie o raggruppare i dati.
- Un sistema di trigger nel database legacy che controlla determinate tabelle. Quando si verifica un inserimento / aggiornamento / eliminazione, inserisce una notifica in una coda di database.
- Questa coda di database viene guardata da un (cosiddetto) servizio di caricamento , che riceve i dati e li inserisce in un argomento Kafka (Kafka viene utilizzato per un sacco di microservizi nei nostri sistemi).
- A (ancora chiamato così) servizio di sincronizzazione che è sottoscritto all'argomento Kafka . Ogni volta che qualcosa viene pubblicato nell'argomento, il servizio lo consuma e lo invia al CMS.
Qui puoi vedere un diagramma che mostra l'architettura ad alto livello:
Per me questa è (una specie) un'architettura basata sugli eventi. Un evento si verifica nel DB legacy e altri servizi reagiscono ad esso.
Tuttavia, un mio collega ha insistito sul fatto che non poteva essere considerato un'architettura basata sugli eventi perché il proprietario dei dati principali che ha provocato l'evento era il database precedente . Fondamentalmente, l'argomento del mio collega era che ogni servizio dovrebbe possedere i propri dati e inviare messaggi di eventi ad altri servizi (tramite un mediatore), e che gli altri servizi dovrebbero reagire a questi eventi e costruire i propri dati in base alle proprie esigenze.
Ora, sono d'accordo sul fatto che ogni servizio dovrà utilizzare i dati dell'evento come sembra opportuno. Ma non sono d'accordo sul fatto che questo argomento significhi che l'architettura che ho spiegato non è guidata dagli eventi. Ho cercato su Internet e non ho trovato una dichiarazione chiara che indicasse che questo dato fosse un prerequisito per un'architettura da considerare come event-driven.
È veramente necessario in un'architettura guidata dagli eventi che ogni attore possegga i dati sui quali lavora? Vale a dire, ho davvero bisogno di non utilizzare i dati anagrafici di il database precedente nel CMS? E / o il CMS dovrebbe invece (idealmente) creare i propri dati e in qualche modo associarli ai dati del database precedente?
Alcuni chiarimenti:
- So che l'architettura presentata potrebbe non essere la migliore che tu possa avere, ma lavorare con i sistemi legacy a volte ti costringe a modificare le cose.
- So anche che questa architettura significa che i servizi sono accoppiati a livello di dati, ma è quello che abbiamo per ora, sempre a causa del sistema legacy.