Ho bisogno di aiuto per progettare un server di elaborazione del lavoro da molto tempo

3

Sto per proporre una nuova architettura per diversi pezzi del sistema su cui sto lavorando; ciò comporterà ottenere un sacco di lavori di sgranatura numerica e di traduzione dei dati fuori tomcat, e su una piattaforma più adatta e ho bisogno di un piccolo consiglio.

In primo luogo, il modo in cui questo sistema è attualmente impostato: c'è un database AS400 e PostgreSQL; alcuni di questi tavoli devono essere sincronizzati in vari punti dell'anno. Un'applicazione di amministrazione in esecuzione su Tomcat6 avrà un pulsante, "Sincronizza" e la classe di azioni struts genererà un nuovo thread per eseguire il lavoro. Il lavoro può richiedere da 15 secondi a 4 giorni (questo è il tempo massimo che abbiamo finora sperimentato).

Non mi piace questo design. Tomcat è un server Web, non un server di elaborazione dei lavori.

Quindi, la soluzione che ho in mente è quella di prendere uno dei nostri server inutilizzati e mettere su Jboss 7. quindi avere una semplice interfaccia su quel server di elaborazione del lavoro (ad es. web, JMS) che ascolta i trigger. quando qualcuno fa clic sul pulsante "Sincronizza" sulla pagina Web, al server di lavoro viene inviato il segnale che indica quale lavoro attivare, quali parametri sono inclusi e ad avviare l'elaborazione del lavoro.

Anni fa ho progettato un concetto simile nell'elaborazione dei lavori in cui avevo una coda JMS che ascoltava i lavori in arrivo. Quando una determinata attività veniva aggiunta alla coda, il sistema si attivava ed eseguiva quell'attività. Ma su quel sistema i lavori non richiederebbero più di 5 o 6 secondi, non diversi giorni quindi non sono sicuro che le code JMS sarebbero la soluzione migliore qui. Ho guardato Quartz ma questo è più di un ricorrente sistema di pianificazione delle attività. Anche se so che posso aggirarlo e farlo funzionare, mi sto ancora chiedendo se questa sia la migliore tecnologia per il problema.

Hai qualche suggerimento?

    
posta scphantm 13.12.2011 - 00:55
fonte

3 risposte

2

In un precedente lavoro, abbiamo usato quello che ho scherzosamente chiamato "array ridondante di computer poco costosi" {1} per distribuire un numero di lavori. Alcuni impiegavano pochi secondi per essere eseguiti, altri impiegavano più di un giorno (rapporti trimestrali). Tutti sono stati progettati per essere in grado di essere riavviati in caso di arresto anomalo. Alcuni lavori hanno funzionato su un programma, alcuni sono stati eseguiti solo su richiesta. Il programma era abbastanza sofisticato da includere cose semplici come "esegui giornalmente" o "esegui mensilmente" o complicate come "esegui mensilmente, eccetto l'ultima settimana del trimestre eseguito ogni giorno". Qualsiasi delle attività pianificate regolarmente potrebbe essere eseguita "ora" (su richiesta).

Poiché mancava l'array {2}, il "tabellone" di chi stava eseguendo quale lavoro veniva letto da una tabella di database. Per determinare se un lavoro si è bloccato o bloccato, ho preso un concetto da computer incorporati chiamato " cane da guardia ". In questo caso, un lavoro in esecuzione aggiornerebbe periodicamente una colonna di stato con 0 . Il software di monitoraggio incrementava periodicamente quella colonna di stato e, se il numero superava una soglia in un certo periodo di tempo, inviava un messaggio a una persona per riavviare sostanzialmente la macchina X. L'idea era di mettere questo "battito" al fine di un ciclo, ma non il ciclo più interno. Avevo programmato di fare in modo che il "polso" si spegnesse ogni minuto con il circuito di controllo che controlla ogni 5 o 10 minuti.

Note:
1 - La gente potrebbe ora chiamarla "griglia" o "ammasso", ma erano una pila di Pentium 75 e 100 che non erano stati ammortizzati, quindi potrei usarli.
2 - Beh, un array 1-dimensionale, poiché si accatastava abbastanza bene e non valeva nulla, se non si fossero lasciati e si fossero rotti, nessuno li avrebbe persi. Non erano ancora completamente ammortizzati, quindi tecnicamente non potevano essere scartati, ma erano abbastanza lenti da essere inutili come computer desktop.

    
risposta data 14.12.2011 - 23:50
fonte
1

È possibile eseguire programmi Java come processi batch in modo nativo su AS / 400 e c'è un driver JDBC Java per Postgres.

RUNJVA è il comando nativo e QSH fornisce un emulatore AIX se ti piace un ambiente Unix migliore.

Nota: se si desidera una soluzione Java più generica, si consideri un motore di integrazione continua progettato per eseguire i lavori in modo controllato per un tempo molto lungo, attivato o programmato, e per evitare di avere più istanze dello stesso lavoro. Usiamo Jenkins per questo - dovrebbe essere possibile farlo funzionare anche tu.

    
risposta data 14.12.2011 - 21:27
fonte
0

Io e il mio team abbiamo dovuto scrivere una soluzione riguardante un enorme processo di caricamento XML e l'inclusione nel database. Abbiamo utilizzato Spring Batch per creare una soluzione molto veloce e affidabile in grado di elaborare centinaia di gigabyte in poche ore. Se usi Spring nel tuo sviluppo e per via del suo approccio basato su POJO, non dovrebbe essere difficile usarlo per il tuo compito IMHO.

Se vuoi saperne di più, ti preghiamo di dare un'occhiata al link

    
risposta data 14.12.2011 - 21:21
fonte

Leggi altre domande sui tag