Sto lavorando su una parte di un sistema ERP in cui ho bisogno di elaborare i dati in modo simile a una serie di lavori batch e sto cercando di decidere la migliore architettura del programma da utilizzare. Sto chiedendo qui perché so di non conoscere molti dei metodi di programmazione più avanzati e sono preoccupato di progettare il mio software in modo arcaico senza accorgermene.
Il mio sistema ha bisogno di elaborare batch di dati e di essere in grado di pianificare i processi di elaborazione a intervalli regolari e anche di essere eseguiti su richiesta. Alcune delle elaborazioni si basano anche su servizi Web esterni.
Al momento la mia architettura è che ho una sola soluzione di Visual Studio C # (con diversi progetti al suo interno). La soluzione produce un programma che dispone di un'interfaccia per l'esecuzione di lavori su richiesta anche per la configurazione di una pianificazione per l'esecuzione automatica dei lavori. Il singolo programma contiene anche tutto il codice di elaborazione batch.
All'interno del programma, ogni "lavoro batch" viene chiamato chiamando un metodo sulla mia classe di controller principale, ad esempio public async Task BillOrders()
, che quindi chiama il metodo appropriato da una classe di servizio di alto livello, che chiama i servizi di livello inferiore , e così via. Le classi stesse sono tutte abbastanza separate in termini di principio di responsabilità singola. Il controller principale chiama ogni metodo di lavoro batch in modo asincrono e gestisce il monitoraggio, la segnalazione di errori, la limitazione e così via.
Tutto funziona, ma sono preoccupato che questo non sia il modo in cui dovrei farlo. Nello specifico, le mie preoccupazioni sono:
-
Dato che ho diverse funzioni separate per il tipo di processo batch tutte nello stesso programma, sono preoccupato che un arresto anomalo o un bug nel programma possa causare il blocco di tutti i processi batch. Sembra anche brutto avere un solo programma che faccia un sacco di cose diverse.
-
Anche se ogni processo batch è correlato a un'area del mio ERP, sono preoccupato che avere un singolo codebase con funzioni diverse finirà per creare qualcosa di monolitico e difficile per diversi sviluppatori di lavorare su diversi aspetti di simultaneamente.
Uno dei motivi principali per cui l'ho fatto come un singolo programma (e la soluzione di Visual Studio) è il contesto di Entity Framework e le classi di servizio sono condivise tra ogni lavoro batch. Se divido il programma in diversi programmi più piccoli, ogni programma avrà un sacco di classi e il contesto EF che sono lo stesso codice. E qualsiasi correzione o estensione di un servizio in un programma dovrebbe essere copiata agli altri. Inoltre, il mio contesto EF ha diverse dozzine di tabelle che vengono eseguite con l'API Fluent.
Ho preso in considerazione l'idea di creare una serie di microservizi, ma ci sono così tante preoccupazioni trasversali che ogni microservizio avrebbe bisogno di molte delle stesse classi di servizio e di EF che ho descritto sopra, vanificando così l'obiettivo dell'utilizzo dei microservizi.
Esiste un'architettura comunemente accettata per questo genere di cose? È quello che sto facendo OK, o sto programmando come se fosse 15 anni fa?