Ho due applicazioni: un'applicazione è essenzialmente un servizio REST, un'altra ha un'interfaccia utente che comunica con REST (utilizza le sue funzioni).
L'idea è che rule engine
è un servizio che può eseguire regole contro l'input - l'input non è necessariamente player
dati ma qualche altro (come level
specifico, o quest
specifico e così via ). Così l'ho trasformato in un microservizio separato. Ma come REST deve convalidare l'input - l'input può provenire non solo dall'applicazione dell'interfaccia utente (che potrebbe fornire i propri controlli) ma da qualche client REST - così ho deciso di creare un database per il servizio del motore di regole (perché i microservizi avrebbero dovuto i propri archivi) che conterrebbero i dati che consentono di convalidare l'input. L'applicazione Sandbox
rappresenta una sorta di admin o sandbox in cui posso creare players
, eseguire alcuni test come level up
e così via. Ha anche un proprio database perché riflette più o meno la finale di un'altra applicazione.
Lo schema è simile a questo
L'applicazione UI Sandbox invia richieste REST al servizio Motore regole con alcuni dati. Il servizio Motore regole convalida i dati con il proprio RDB1 (che contiene gli stessi dati di RDB2 nella sandbox - le tabelle players
e levels
sono uguali in entrambi i database in modo che i dati siano coerenti), esegue l'esecuzione delle regole e restituisce il risposta.
I miei problemi è scegliere la strategia su come sincronizzare entrambi i database per mantenerli coerenti (per ora all'avvio, popolano entrambi i database con gli stessi dati). Vedo diversi approcci
- crea un servizio separato che sarà un singolo endpoint per RDB, in pratica solo questo servizio avrà accesso ai dati
players
elevels
. - usa il sistema di messaggistica (usa RDB2 come una sorta di database master) e dopo le modifiche in RDB2 invia il messaggio e aggiorna RDB1 (o altri database) (usa il modello pub-sub).
- utilizza la cache nell'applicazione REST anziché nel database e utilizza il modello pub-sub per aggiornarlo.
Quale approccio sarebbe meglio usare? O ci sono altri modi?