Modo corretto per gestire il database per l'architettura backend distribuita

0

Il back-end della mia applicazione è costituito da una serie di attività autonome collegate tra loro da code di messaggistica. Hanno tutti bisogno di accedere allo stesso database SQL per poter eseguire e memorizzare i loro risultati. In questo momento, tutte le attività accedono direttamente al database SQL, ma non avendo un'entità centralizzata per gestire l'accesso a quel database, non sono sicuro di come mantenere il database (applicare le migrazioni, ...).

Una soluzione sarebbe quella di accedere al database tramite un'API, che sarebbe responsabile della manutenzione del database. Questo approccio ha anche il vantaggio di disaccoppiare l'implementazione del datastore dal codice dell'applicazione. D'altra parte, l'applicazione deve fare query molto costose (inserire un CSV da 500 MB in una tabella, ad esempio), e non sono sicuro di come le prestazioni potrebbero essere influenzate per un tale caso d'uso.

Qual è il modo "consigliato" di progettare un sistema simile?

    
posta nbarraille 10.09.2018 - 14:28
fonte

2 risposte

1

In teoria, ognuno dei servizi di gestione dei messaggi è già un'apologia del database.

La vera domanda è: hai separato i tuoi dati correttamente?

Se disponi di molti servizi, tutti utilizzano lo stesso database come "odore di codice". Non perché i tuoi servizi accedano direttamente al database, ma perché utilizzano lo stesso stesso database.

Ora se stanno facendo tutte le azioni del database, ad esempio aggiornando lo stato dell'ordine mentre gli eventi si verificano. Va bene, si nasconde il db dietro un servizio di ordine e si parte.

Se tutti hanno le proprie tabelle e operazioni separate, dovresti pensare a separare i dati in un database esclusivamente per quel servizio.

    
risposta data 10.09.2018 - 19:33
fonte
0

Come fai notare un'API centrale che nasconde i dettagli dell'implementazione del database è la soluzione più semplice e probabilmente abbastanza buona. Non mi preoccuperei troppo delle prestazioni se le query direttamente eseguono già sufficientemente.

Tuttavia, è possibile che un'API centrale diventi un collo di bottiglia. In questi casi, un approccio possibile consiste nel far sì che le modifiche dell'API centrale vengano trasmesse nel momento in cui si verificano, in un log dei messaggi e quindi riprodurre il registro dei messaggi in un altro database in ognuno dei servizi che lo consumano. Lo schema del registro messaggi è separato dallo schema del database di origine, quindi è possibile continuare a eseguire le migrazioni senza influire sulle letture. Ogni servizio richiede una propria copia del database, quindi non vi è alcun collo di bottiglia centrale. Le operazioni di scrittura devono ancora passare attraverso l'API di origine e leggere le operazioni anche nei casi in cui è necessario garantire la visualizzazione dell'ultima versione dei dati (perché questo sistema alla fine sarebbe coerente). Questo approccio introduce molta complessità, quindi vorrei evitarlo e seguire l'approccio API centrale per quanto ragionevolmente possibile.

    
risposta data 11.10.2018 - 10:01
fonte

Leggi altre domande sui tag