In C-06 ho definito l'architettura e la faccio evolvere dal 2013, da unico sviluppatore.
I dati sono di due tipi: quelli nel database e i dati di progetto, scritti su file e gestiti da una libreria dedicata. All'inizio tutta la parte applicativa era concentrata in un unico blocco, e con la crescita del carico questo è diventato un problema.
Non ho riscritto il sistema né l'ho diviso in molti servizi. Con il cliente e il suo personale abbiamo analizzato i flussi e individuato i colli di bottiglia; poi ho separato solo ciò che lo giustificava:
- la gestione dei dati di progetto, spostata su un server separato;
- i processi di lunga durata, affidati a una coda RabbitMQ e a programmi che elaborano le richieste;
- il backend principale, rimasto a servire le API legate al database e diventato il punto di ingresso unico per le altre richieste (API gateway);
- la migrazione graduale del codice di backend da .NET Framework a .NET;
- una cache Redis nella gestione dei progetti, per non ripetere operazioni che a breve distanza danno lo stesso risultato.
Nel tempo si è aggiunta un'app Android per seguire le attività sul territorio: ha richiesto una Web API che riceve i dati grezzi dai dispositivi e un servizio che li elabora e li prepara per le analisi successive.
Il carico sul nucleo principale è diminuito e le prestazioni sono migliorate, con pochi componenti in più da gestire. Ogni componente separato aggiunge complessità e costi di gestione: l'ho introdotto solo dove il vantaggio era evidente.
La migrazione a .NET rende anche il monitoraggio più completo: oltre al codice dell'applicazione, le librerie di .NET producono già tracce e misure, che si raccolgono con poca configurazione. Il prossimo passo che sto valutando è estendere questa copertura con OpenTelemetry, per basare il monitoraggio su strumenti standard invece che su soluzioni scritte apposta.