Ho creato circa una dozzina di servizi per una intranet. Ora sono arrivato al punto che questi servizi sono più accoppiati tra loro rispetto a quelli con cui mi trovo a mio agio, e ho riscontrato problemi in cui una volta che il servizio può causare la degradazione di alcuni altri servizi.
Ho lavorato su un progetto EDA in modo da poter rendere questi servizi disaccoppiati l'uno dall'altro, ma poiché sono l'unico programmatore qui ho bisogno di un feedback.
Il design mira a risolvere questi scenari:
Scenario 1: il client richiede i dati dal servizio A, per soddisfare la richiesta Il servizio A richiede i dati dal servizio B ma il servizio B non funziona e non risponde
Scenario 2: il client aggiorna un'entità nel servizio B, il riferimento a questa entità deve essere aggiornato nei servizi A e C
Ho diviso il design in due parti, Operazioni e Eventi
Un'operazione viene inviata da un servizio o un client per modificare un'entità in un servizio. Ciò si traduce sempre in un evento che viene licenziato. Ogni operazione contiene un ID utente, un ID operazione e alcuni timestamp.
Un evento è una reazione a un'operazione, notifica a chiunque stia ascoltando che si è verificata una modifica. Ogni evento contiene l'id dell'operazione che l'ha avviato, l'id dell'utente che l'ha causato e alcuni timestamp. Ogni evento ha anche un hash dell'entità completa in modo che tutti gli ascoltatori possano confrontarsi con le loro versioni.
Uso RabbitMQ come bus dei messaggi e ogni servizio ha code permanenti e permanenti per archiviare eventi o operazioni in sospeso.
Per disaccoppiare il servizio gli uni dagli altri, ogni servizio memorizza nella cache qualsiasi entità che dipende da quella che appartiene a un altro servizio.
Quando un servizio richiede un'entità da un altro servizio lo recupera e lo memorizza in una tabella nel suo database. Quindi ascolta le modifiche apportate a qualsiasi entità nella sua cache e le aggiorna quando si verifica un evento correlato ad esso.
Quando la memorizzazione o il recupero di un'entità dalla cache non riesce, lo recupera nuovamente dal servizio appropriato.
Per l'auditing, ho un servizio che ascolta gli eventi da tutti i servizi e li memorizza. Può quindi ricreare qualsiasi entità in qualsiasi momento specifico.
Mi piacerebbe ricevere commenti da chiunque sia più esperto di me e se ci siano problemi evidenti con il design.