Vengo dallo sfondo del monolite, utilizzando un unico grande database relazionale. Dalla mia ricerca, molti sostenitori dell'architettura dei microservizi privilegiano l'architettura basata su eventi piuttosto che su REST. La seguente domanda si applica alla comunicazione interservizi, tra contesti limitati (in termini DDD) e NOT agli eventi all'interno di un BC, né creazione di eventi.
A quanto ho capito, per separare i servizi gli uni dagli altri, un bus di messaggi come RabbitMQ viene usato per pubblicare un evento di dominio, che contiene informazioni relative all'evento, come UserCreated
o UserSuspended
, e altri limiti i contesti possono farne uso per archiviare i dati di cui hanno bisogno nel proprio database. Ad esempio, un servizio di fatturazione potrebbe richiedere solo user id
e status
in modo che non generi fatture per gli utenti sospesi. Con questi dati utente "memorizzati nella cache", non è necessario effettuare una chiamata API REST al User
BC per ottenere le informazioni. Questo è considerato "autonomo" piuttosto che "autorità".
Un paio di domande:
- In che modo possono essere distribuiti nuovi servizi? Nell'esempio sopra, supponiamo che il servizio Utente esista ma che il servizio di fatturazione sia in fase di costruzione. Ha bisogno di seminare il suo database con tutti gli stati utente esistenti. Supponendo che non disponga dell'intera cronologia degli eventi disponibili nel servizio Utente (come con RabbitMQ), ciò significa che deve essere soddisfatta una delle due opzioni: A) Il servizio utente deve fornire un endpoint API che il nuovo servizio di fatturazione può utilizzare nelle sue migrazioni per ottenere gli stati degli utenti. È necessario eseguire ulteriori lavori nel servizio utente se questo endpoint non esiste. Oppure B), lo script di distribuzione / migrazione di fatturazione può rompere le responsabilità una volta e accedere direttamente al database degli utenti. Ma questo significa che gli sviluppatori di Billing devono imparare lo schema dei dati da un altro servizio.
- Come possono essere corretti i bug che causano incoerenze? Ad esempio, in qualche modo uno sviluppatore ha rotto l'editore e non sono stati prodotti
UserCreated
oUserSuspended
per un'ora. Il bug viene notato e corretto, ma mancano ancora un'intera ora di eventi. Due possibili soluzioni: A) il dev daUser
BC pubblica manualmente gli eventi mancanti. Avrebbe bisogno di capire quali eventi sono stati persi (se possibile), quindi scrivere script per costruirli (in termini di tempo). Ciò sarebbe ulteriormente problematico se nuovi eventi già attivati rendessero obsoleti quelli originali mancanti. Oppure B) gli altri contesti limitati potrebbero essere notificati per eseguire script che aggiornano i loro dati tramite l'API dell'utente (restituendo al modello autorità )
Un'altra questione di fondo qui è, nella comunicazione tra servizi, dove è la fonte ultima della verità per eventi esterni? Si trova nel flusso di eventi o nell'API fornita dai contesti limitati?
Mi piace l'idea dei sistemi autonomi per ridurre l'accoppiamento, rimuovere le dipendenze e consentire ai servizi di evolvere più rapidamente, ma temo situazioni che causino incoerenze che non si verifichino > autorevole struttura , dove i dati sono sempre aggiornati tramite chiamate API live. Qualsiasi suggerimento sarebbe molto apprezzato.