Diciamo che ho un sistema di microservizi basato su eventi - un cluster di microservizi - che accetta ordini e lavora con loro. Gli ordini vengono effettuati da un sistema adiacente esterno che funziona in modo sincrono tramite un endpoint REST fornito da uno dei miei microservizi. Questo servizio funge da facciata per mantenere tutte le cose sincrone all'esterno del mio cluster poiché ogni comunicazione all'interno è basata sui messaggi (asincrona). Gli ordini in arrivo verranno archiviati in un database da un altro dei miei microservizi che reagisce a un messaggio di evento inviato dal microservice della facciata.
Ora, supponiamo che vi sia un obbligo di gestire la cancellazione in entrata per gli ordini e che tali cancellazioni avvengano anche tramite REST. Per le cancellazioni valide è stato inserito un ordine prima e quindi è memorizzato nel database del mio cluster.
Se non provassi a progettare eventi guidati, penserei a qualcosa di simile: Se si verifica una cancellazione tramite REST, sincro controllo se un ordine corrispondente per tale cancellazione è nel mio database. In tal caso, la mia risposta sincrona alla chiamata REST sarebbe 200 se tutto è OK e in caso contrario, rifiuterei l'annullamento non valido.
Ma dal momento che sto cercando di progettare un sistema basato su eventi, non so come gestirlo. Penso che forse avrei un altro microservizio di facciata che fornirebbe l'endpoint REST per la cancellazione. E alla ricezione di una cancellazione dovrebbe anche inviare un messaggio in una specifica coda / argomento per iniziare a lavorare in modo asincrono da lì. Ma come posso gestire il fatto che ho bisogno di informazioni dal database per verificare se una cancellazione non è valida e questo nuovo servizio di facciata non ha accesso al mio database di cluster? Devo accettare sempre le cancellazioni e dire al mondo esterno che tutto va bene, anche se non so se è vero? E se l'altro sistema ha bisogno di sapere di cancellazioni non valide, devo dare loro l'accesso in modo che possano ascoltare uno dei miei argomenti / code, in modo che possano quindi reagire a un messaggio di evento che viaggia attraverso il mio cluster contenente le informazioni se una cancellazione era valida? O devo creare un altro servizio in cui il mondo esterno può chiedere se una cancellazione era valida? E se non riesco a parlare con i manutentori del sistema straniero o non vogliono cambiare i loro sistemi API? O devo dare al mio database l'accesso a microservice un endpoint REST accessibile internamente al quale accedo dal mio microservizio di facciata in modo sincrono?
Come faccio a progettarlo mantenendo i miei microservizi scalabili, resilienti, liberamente accoppiati, ecc.?
Spero di aver fatto la mia domanda in modo comprensibile. Forse sto pensando completamente nel modo sbagliato e / o mi manca qualcosa sull'architettura guidata dagli eventi?
Spero che qualcuno qui possa darmi una soluzione, un'idea o un suggerimento nella giusta direzione.
Molte grazie in anticipo!