Come dividere correttamente un monolite e fare affidamento sullo stesso dominio

1

Contesto

Sto sviluppando un'applicazione java Spring Boot. Attualmente è un monolite con il resto dell'API e il front-end (basato su vaadin) nello stesso grande progetto.

Sebbene sia molto facile da sviluppare e implementare, è sempre più difficile aggiungere funzionalità. Ci sono troppe preoccupazioni nella stessa applicazione.

Inoltre, ho eseguito alcuni test di carico sulla mia app e non sono sopravvissuti più di ~ 1.5k (virtuali) utenti che lo utilizzavano durante 1 minuto (da +/- 1000 a 4000 richieste / s).

Cosa ho già studiato

Ho letto dei microservizi per il ridimensionamento ma dovrei dover riscrivere quasi l'intera applicazione per questo, dal momento che tutti i miei dati sono relazionali e memorizzati in un database relazionale (e non ho idea di come cambiare quello a dati indipendenti).

Il problema

Quello che ho cercato di fare ora è dividere il progetto in tre sottoprogetti. Un progetto di dati che contiene tutti i domini e servizi, un progetto API che contiene l'API REST e un progetto front-end interno che contiene il frontal interad vaadin.

Il progetto di dati sarebbe solo una libreria per gli altri progetti. Il progetto API e il progetto di frontend includevano entrambi questo progetto di dati nel loro gradle ed entrambi utilizzerebbero questo progetto come libreria per accedere al database.

La suddivisione di questo progetto è piuttosto difficile e non so nemmeno se questa è la strada giusta da seguire. Quindi, in questo caso, sta dividendo una decisione corretta?

Il mio processo di pensiero è stato che una volta suddivisi i progetti, avrei potuto sviluppare con più facilità, e inoltre avrei potuto generare istanze API indipendenti e collegarle a un servizio di bilanciamento del carico (sebbene tutti utilizzerebbero lo stesso database).

D'altro canto, questa scissione sta causando molti problemi di dipendenza dal momento che il progetto originale era Spring boot e il progetto di dati non sarebbe "eseguibile" (quindi non può dipendere dal plugin di avvio come ho letto). Ma questa è una domanda per StackOverflow solo se l'architettura è giusta.

TL; domande DR

  • È corretto utilizzare un progetto con dominio e livello di servizio, come libreria?
  • È corretto accedere allo stesso database con più di un'applicazione?
  • In caso contrario, qual è la forma corretta di dati di acessing (lettura e scrittura) da istanze di un progetto API (per bilanciare il carico)?
posta Lucas Montenegro Carvalhaes 25.04.2018 - 00:04
fonte

2 risposte

0

Prima di iniziare a suddividere il tuo progetto, vorrei fare un'osservazione sui test di carico:

  • Il limite di Tomcat è di circa 1.000-4.000 utenti simultanei al minuto, per una singola istanza
  • Tomcat è il server Web predefinito per le app Spring Boot, a meno che non lo modifichi in modo specifico nel tuo POM.
  • Aggiungendo semplicemente un'altra istanza con un servizio di bilanciamento del carico in primo piano è possibile aumentare il numero di utenti simultanei al minuto, presupponendo che il servizio sia veramente idempotente e non ci sono altre limitazioni

I tuoi limiti potrebbero essere il tuo server web, server di database, RAM, ecc. Assicurati di comprendere appieno la natura della limitazione della velocità. Il concetto di dividere la tua app di avvio primaverile in più app di avvio a molla (servizi micro o almeno più piccoli) non è una garanzia per migliorare le prestazioni. Stai introducendo una complessità che non hai adesso.

Is it correct to use a project with both domain and service layer, as a library?

Sì. In realtà non è raro avere il tuo livello di astrazione dei dati come una libreria e includerlo semplicemente come dipendenza.

Tuttavia, se si persegue l'obiettivo dei microservizi, è più comune che ciascun microservizio rimanga il più isolato possibile da altri servizi.

Is it correct to access the same database with more than one application?

C'è un po 'di dibattito su questo, ma in questo caso opterei per un approccio molto pragmatico, sì.

Se stavate iniziando un nuovo progetto di microservizi, potreste sostenere che database separati per servizio sono più corretti. Non sono personalmente così risoluto su questo, e nel tuo caso stai modificando un sistema legacy che funziona. Mantieni il più piccolo possibile i tipi di modifiche e le dimensioni delle modifiche, in modo da avere la speranza di essere terminato.

If not, what is the correct form of acessing data (read and write) from instances of an api project (to load balance)?

Onestamente, la salsa segreta alla capacità di scalabilità dell'architettura dei microservizi ha a che fare con la possibilità di far ruotare le istanze di servizio per soddisfare la domanda, e quindi farle roteare quando non ne hai più bisogno. Ciò ti consente di scalare su richiesta e di risparmiare, laddove possibile.

La differenza tra il microservizio in scala e un servizio monolitico ha a che fare con la granularità. Se è solo una piccola parte della tua app che viene martellata, puoi far ruotare il microservizio (i) che si riferisce a quella piccola parte invece dell'intera cosa.

C'è un'intera infrastruttura per monitorare e gestire i tuoi servizi, che aggiungono ulteriore complessità. Non ottieni qualcosa per niente.

    
risposta data 25.06.2018 - 18:33
fonte
0

Il fatto di voler riutilizzare un livello di servizio come libreria probabilmente significa che il modo in cui i servizi sono stati scomposti non era corretto. Ogni microservizio dovrebbe essere il proprio dominio. Il modello di dominio, supponendo che sia semplicemente DTO, potrebbe funzionare, ma espone un serio rischio di accoppiamento a lungo termine.

Sicuramente no, in questo modo è solo dolore e di nuovo punta alla scomposizione dei servizi che non si trovano lungo le linee di dominio corrette.

Se il servizio A vuole interagire con il servizio B, effettui chiamate Web.

    
risposta data 26.04.2018 - 14:48
fonte

Leggi altre domande sui tag