Per un sistema distribuito, è necessario osservare i progressi di piccole applicazioni su computer distribuiti (runtime 5 - 20 minuti).
C'è una web fronted, che adesso mostra solo un elenco di quelli più piccoli
applicazioni (chiamate job), con lo stato di ciascuna di
loro, come preparing
, running
, finished
Quindi in web-ui, un amministratore può vedere:
- nome
- Stato
- ora di inizio
- chiama parametri
da qualsiasi computer nella rete, probabilmente per l'intero sistema.
Ciascuna proprietà è memorizzata nel database, quindi ogni lead di cambiamento dello stato a una chiamata per scrivere nel database. Potrebbero esserci migliaia di quei posti di lavoro alla volta.
Descrizione del sistema distribuito:
Componenti centrali, serviti solo in una posizione:
-
Server di database (contenente i risultati dei lavori per eseguire statistiche, avere una panoramica dei lavori eseguiti negli ultimi tre mesi, ecc.)
-
Server delle applicazioni (glassfish, java, esegue il software del server centrale)
Componenti distribuiti, ogni sito ne ha almeno uno, collegato tramite l'area Internet / WAN: (probabilmente circa 20 siti, ognuno ha 1..4 controller di lavoro, ogni controller di lavoro esegue circa 20 lavori in parallelo)
- Componente controller di lavoro (windows, c #, wcf, avvia e osserva piccoli lavori)
- Piccole applicazioni che eseguono attività, avviate da Job-Controller (i lavori)
Quindi, per una stima vaga:
20 sites * 4 Job-controllers * 20 jobs = 1600 jobs in parallel
each of which runs from 0 to 100 percent in about 5 minutes on average,
resulting in a progress update each 3 seconds.
giving 533 progress updates per second (over the internet)
Ora il cliente vuole vedere qualcosa come una barra di avanzamento per ognuno di questi lavori.
In un primo momento, ho pensato che questo potrebbe portare ad un traffico di rete elevato e ad una grande quantità di traffico sul server del database.
Non penso che scrivere progressi come 1%, 2%, 3% nel database sia una buona idea. Il runtime di quei lavori non è molto facile da stimare bene (quindi è abbastanza vicino ad un risultato reale), ma ogni lavoro può dire molto bene qual è il suo progresso.
Quale sarebbe un buon approccio architettonico per osservare il progresso di possibilmente migliaia di quei mini-lavori? (Si noti che viene fornita un'infrastruttura mista. Esiste il vincolo che il sistema sarà costruito su così.: Glassfish centrale + java e per sito Windows + WCF + C #)
In questo momento penso che ogni controller di lavoro possa aggiornare lo stato di avanzamento di tutti i lavori controllati ogni 10 secondi contemporaneamente. Sarebbe un approccio accettabile?