Domanda

Ho un doozy di un problema qui. Sto puntando a costruire un quadro per consentire l'integrazione di diversi modelli di simulazione del traffico. Questa integrazione si basa sulla condivisione di connettività di collegamento, i costi dei collegamenti, e veicoli tra simulazioni.

Per effettuare una simulazione distribuita, ho intenzione di avere un 'coordinatore' (topologia a stella). Tutte le simulazioni partecipanti è sufficiente registrarsi con esso, e parlano solo al coordinatore. Il coordinatore quindi coordina l'esecuzione dei vari compiti tra ogni simulazione.

Un rapido esempio di un problema di distribuzione, è quando una simulazione è 'responsabile' di alcuni oggetti, come una strada. E un altro è 'responsabile' di altre strade. Tuttavia, queste strade sono interconnesse (e quindi, dobbiamo sincronizzazione tra queste simulazioni, e devono essere in grado di scambiare dati / richiamare i metodi distanza).

Ho dato un'occhiata al RMI e sto pensando che può essere adatto per questo compito. (Astrarre cui dover creare una disciplina segnalazione over-wire).

E 'questo sano di mente? Il problema qui, è che i partecipanti hanno bisogno di simulazione di centralizzare alcuni della loro archiviazione dei dati nel 'coordinatore' per garantire la sincronizzazione esplicito tra le simulazioni. Inoltre, alcune simulazioni possono richiedere componenti o metodi da altre simulazioni. (Qui l'idea di utilizzare RMI).

Il mio approccio di base è quello di avere il 'coordinatore' eseguire un gigante registro RMI. E ogni simulazione semplicemente guarda tutto nel Registro di sistema, in modo che gli oggetti corretti vengono utilizzati ad ogni passo.

Qualcuno ha qualche consiglio per voce su questa strada?

È stato utile?

Soluzione

Si consiglia di controllare le Hazelcast anche. Hazelcast è un transazionale open source, distribuito / partizionato implementazione di coda, tema, carta, set, list, blocco e servizio esecutore. E 'super facile da lavorare; basta aggiungere hazelcast.jar nel classpath e iniziare a scrivere codice. è richiesto quasi alcuna configurazione.

Se siete interessati a eseguire i vostri compiti corri, Callable in modo distribuito, quindi si prega di consultare la documentazione distribuita esecutore servizio all'indirizzo http://code.google.com/docreader/#p=hazelcast

Hazelcast è rilasciato sotto licenza Apache e il supporto di livello aziendale è inoltre disponibile.

Altri suggerimenti

E 'questo sano di mente? IMHO no. E ti dirò perché. Ma prima io aggiungo il disclaimer che questo è un argomento complicato in modo che qualsiasi risposta deve essere visto come a malapena graffiare la superficie.

Per prima cosa, invece di ripetermi Io punto ad un sintesi della griglia di Java / tecnologie di cluster che ho scritto poco fa. Il suo un elenco quasi completo.

La topologia a stella è "naturale" per un "ingenuo" (non voglio dire che in un senso negativo) implementazione perché point-to-point è semplice e centralizzando la logica di controllo chiave è anche semplice. Non è tuttavia ad elevata disponibilità. Si introduce problemi di scalabilità e un unico collo di bottiglia. Esso introduce inefficienze di comunicazione (cioè i punti comunicano tramite un processo a due fasi per il centro).

Che cosa si vuole veramente per questo è probabilmente una soluzione cluster (un data / griglia di calcolo piuttosto che) e io suggerirei di guardare a Terracotta . Idealmente ci si guarda a Oracle Coherence ma è senza dubbio costoso ( rispetto alla libera). Si tratta di un prodotto fantastico però.

Questi due prodotti possono essere utilizzati un certo numero di modi, ma il nucleo di entrambi è per trattare una cache come una mappa distribuito. Hai messo le cose in, si prende le cose e fare fuoco fuori il codice che altera la cache. Coerenza (con la quale io sono più familiari) in questa materia scale fantasticamente bene. Questi sono più "server" a base di prodotti anche se per un vero cluster.

Se si sta guardando un modello più distribuito allora forse si dovrebbe guardare di più di un approccio basato SOA.

Dai un'occhiata alla http://www.terracotta.org/

la sua distribuito Java VM, quindi ha il vantaggio di essere cluster applicazione sembra non è diverso da un'applicazione standard Java.

L'ho usato in applicazioni e la velocità è molto impressionante finora.

Paul

Hai pensato di usare un approccio coda di messaggi? Si potrebbe utilizzare JMS per comunicare / coordinare le attività e dei risultati tra un insieme di nodi di server /. Si potrebbe anche usare SQS di Amazon (Simple Queue Service: aws.amazon.com/sqs). E hanno i server in esecuzione su EC2 per consentire di scalare su e giù, come richiesto

Solo i miei 2 centesimi.

Date un'occhiata a JINI, potrebbe essere di qualche utilità per voi.

Bene, Jini, o più specificamente JavaSpaces è un buon punto di partenza per un approccio semplice al problema. JavaSpaces consente di implementare un modello master-worker, dove il vostro maestro (coordinatore nel tuo caso) scrive compiti al JavaSpace, e la query lavoratori e elaborare tali compiti, scrivendo i risultati indietro per il master. Dal momento che il problema non è imbarazzante parallelo, e vostri lavoratori necessità di sincronizzare / scambio di dati, questo aggiungerà una certa complessità alla soluzione.

Utilizzando JavaSpaces aggiungerà molto di più di astrazione per l'implementazione che l'uso di pianura RMI (che viene utilizzato dal framework Jini internamente come il default "protocollo wire").

Date un'occhiata a questo da sole per un intro.

E di Jan Newmarch Jini Tutorial è un buon posto per iniziare ad imparare Jini

Proprio in aggiunta alle altre risposte che, per quanto ho visto tutti si concentrano su grid e cloud computing, si dovrebbe notare che i modelli di simulazione hanno una caratteristica unica: tempo di simulazione.

Quando si esegue modelli di simulazione distribuita in parallelo e sincronizzato poi vedo due opzioni:

  • Quando ogni modello di simulazione ha il suo elenco orologio della simulazione e l'evento allora questi devono essere sincronizzati attraverso la rete.
  • In alternativa ci potrebbe essere un singolo orologio della simulazione e lista degli eventi che "spuntare il tempo" per tutti i modelli distribuiti (sub).

La prima opzione è stato ampiamente studiato per l'Architettura del livello alto (HLA) si veda ad esempio http: / /en.wikipedia.org/wiki/IEEE_1516 come antipasto.

Tuttavia la seconda opzione sembra più semplice e con meno overhead per me.

GridGain è una buona alternativa. Hanno una mappa / ridurre implementazione con "sostegno diretto API per dividere e aggregazione" e "session compito distribuita". È possibile sfogliare loro esempi e vedere se alcuni di loro si adatta con la vostra ha bisogno.

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