Domanda

Ho una simulazione monte carlo multi-thread c # , l'applicazione è già strutturata in modo tale da poter essere suddivisa in attività che vengono eseguite in modo indipendente, un TaskController esegue attività, aggrega risultati intermedi, verifica convergenza (criteri di terminazione anticipata) quindi restituisce i risultati finali, attualmente implementato utilizzando un ThreadPool.

Vorrei sfruttare più di un computer per facilitare questo calcolo . Non ho l'approvazione o l'infrastruttura per utilizzare IIS (questa politica non cambierà) ma posso usare ad esempio WCF con il collegamento endpoint NetTcpBinding , ho testato questa comunicazione attraverso il server e dispone delle autorizzazioni e delle opere appropriate.

Per iniziare, sto pensando di avere un master exe (app console) e diversi slave su altri server come lavoratori dedicati (dovrebbero essere ex? o servizi Windows?), alla fine potrei avere questo set per funzionare su centinaia di workstation (oltre ai server) all'interno dell'azienda durante il tempo di inattività (o quando è attivo uno screensaver).

Potrei scriverlo da solo, ma dovrò gestire le comunicazioni, 1, 2 vie? risoluzione anticipata (controllo dei risultati della convergenza intermedia), annullamento delle attività non più necessarie, distribuzione del lavoro, individuazione di macchine disponibili e pronte per la distribuzione del lavoro, limitazione / sospensione del lavoro se una workstation non è più inattiva? tutto il resto che va in un sistema distribuito?

Il master (controller delle attività) dovrebbe conoscere gli indirizzi (ip) di tutti i lavoratori slave e dire loro di fare il lavoro (se sono disponibili) o i lavoratori slave dovrebbero semplicemente conoscere l'indirizzo principale e richiedere il lavoro quando si trovano una posizione per farlo, o la comunicazione dovrebbe fluire in entrambi i modi? Questo verrà eseguito su un orologio 24 ore con circa 9 corse avviate al giorno per supportare diverse aree aziendali.

Sto cercando consigli per .net grid / librerie distribuite che possono aiutare e alcuni consigli sull'architettura in questo sforzo.

Aggiorna

Qualcuno ha esperienza con uno dei seguenti?

http://www.digipede.net/ (commercial)
http://www.gridbus.org/~alchemi/
http://ngrid.sourceforge.net/
http://www.osl.iu.edu/research/mpi.net/

o JavaSpaces usati, Jini da .net o trovato tecnologie .net equivalenti

http://java.sun.com/developer/technicalArticles/tools/JavaSpaces/
http://www.jini.org

Grazie

È stato utile?

Soluzione

Vorrei investigare sulla possibilità di utilizzare architettura basata sullo spazio per questo.

Il master avrebbe scritto i lavori in uno spazio (essenzialmente un repository di oggetti). I clienti che consumano sono sempre alla ricerca di lavori e man mano che i lavori diventano disponibili, estrarranno dallo spazio, elaboreranno e riscriveranno i risultati in quello spazio o in un altro (tutti in una transazione). Contrassegneresti i lavori come appartenenti a una determinata corsa per raggruppare i risultati.

Il vantaggio di questo è che si ridimensiona molto facilmente (semplicemente aggiungendo più consumatori). I consumatori dovrebbero determinare quando possono lavorare e devono semplicemente essere configurati con informazioni sullo spazio (come trovarlo). Il produttore è completamente disaccoppiato dall'insieme dei consumatori.

Poiché il lavoro viene elaborato nell'ambito di una transazione, se un consumatore non riesce a completarsi, il lavoro ritorna nello spazio ed è disponibile per l'elaborazione da parte di un altro consumatore.

Puoi gestire facilmente risultati intermedi. Il produttore prende i risultati dallo spazio e può derivare intermedi quando i risultati diventano disponibili. È possibile annullare facilmente i lavori. Basta rimuoverli dallo spazio.

Puoi aggiungere più produttori molto facilmente. Scrivono semplicemente nello stesso spazio e, se i lavori vengono taggati in modo appropriato, i risultati vengono collegati al produttore in modo inequivocabile.

Non sono sicuro di quali framework siano disponibili per .Net, sfortunatamente (vengo dal mondo Java e userei Javaspaces : utilizzano il rilevamento dinamico e non è necessaria alcuna configurazione). Ma vale la pena cercare su Google. Forse (se questo è abbastanza potente), puoi scrivere il produttore / consumatore C # per l'interfaccia con un'infrastruttura Javaspace.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top