2009-12-09 32 views
7

Attualmente partecipo a un progetto in cui l'applicazione deve essere in grado di rilevare altre istanze dell'applicazione con lo stesso nome di applicazione in esecuzione su una LAN (d'ora in avanti chiamata nodo).API della meccanica di rilevamento per l'applicazione basata su Java

Prerequisiti: Tutti i nodi conoscere il proprio indirizzo IP e numero di porta TCP tutti i nodi hanno un nome tutti i nodi hanno accesso alla LAN

Che cosa ho bisogno:

Tutti i nodi deve conoscere il Indirizzo IP e porta TCP dell'altro nodo. Se un nodo si interrompe, dovrò essere informato a livello di programmazione di questo. Se viene visualizzato un nuovo nodo, sarà necessario notificarlo a livello di programmazione. È ESSENZIALE che nessun server master o altra applicazione sia necessaria, deve essere un'API che posso integrare nell'applicazione corrente. Inoltre, deve essere open source e preferibilmente con licenza MIT o ApacheV2.

Questo è tutto!

L'applicazione è basata su JVM, quindi qualsiasi API lo farà. Ho guardato ZooKeeper ma sembra essere piuttosto una grande dipendenza per le poche funzionalità di cui abbiamo bisogno.

E, se non conosci API, ma hai dei buoni link da condividere su come ottenerlo scrivendo io stesso (white paper, blog, libri, quant'altro), accetterei più che volentieri le cose così pure.

Quindi la domanda è, come faccio?

risposta

5

Consiglio vivamente JGroups che è piuttosto bello e molto lavorato attivamente e supporta qualsiasi tipo di scoperta (multicast IP, elenco fisso, servizio di ricerca esterni, ecc) su qualsiasi attività di trasporto.

Un'altra opzione sarebbe Apache MINA ma JGroups è IMO migliore per la scoperta (perché supporta qualsiasi tipo di rilevamento).

+1

JGroups sembra carino, e ho anche trovato Apache Tribes attraverso un altro canale. Grazie mille! :) –

+0

ha testato 'JGroups' e ha ricevuto un messaggio dai responsabili della sicurezza della rete della mia azienda dicendo che il cattivo traffico proviene dalla mia macchina ... È a causa del multicasting IP, immagino? – andrii

2

Se siete tutti sulla stessa sottorete, una soluzione semplice sarebbe utilizzare multicast sockets. Scegli un indirizzo (beh, rendilo configurabile) e poi quando una nuova istanza si avvia invia un "ping" multicast. Questo notifica gli altri server.

Ovviamente questo non ti dirà quando un'istanza si interrompe. Avete due scelte:

  1. Ping abbastanza spesso che quando non si riesce a ricevere un ping per un certo periodo di tempo si assume che l'istanza è inattivo; oppure
  2. Alla notifica di una nuova istanza si apre una connessione TCP a tale istanza. È necessario eseguire il ping su tale socket molto meno spesso per tenerlo aperto (l'inattività lo ucciderà alla fine) e si può essere avvisati della chiusura dall'altra parte o della semantica TCP per il timeout del socket.

Avrete bisogno di 1-2 thread per monitorare questo e attivare gli eventi appropriati.

+0

Assolutamente Cletus, il fatto è che costruirlo da zero con blocchi primitivi (battiti del cuore a mano, ecc.) Probabilmente aumenterà il rischio che la soluzione abbia margini limite e l'affidabilità forse soffra. Ecco perché speravo di far leva sui sassi di un gigante :) –

+1

So cosa intendi ma sembra che ogni volta che cerco una libreria per risolvere un problema piccolo ma complesso, scambi solo una serie di casi angolari per una serie di casi d'angolo specifici per la biblioteca. – cletus

+1

@Cletus - date un'occhiata a ZeroConf - è ciò che descrivete fatto bene e di qualità di produzione. –

1

Ci sono un sacco di opzioni per questo genere di cose, il mio preferito è hazelcast con licenza Apache e ha zero dipendenze e un minimo di configurazione.

Un'opzione più stabilita è jgroups questa licenza sotto licenza LGPL.

+0

Gid, sembra interessante, grazie per il suggerimento. –

+0

Sapevo di jgroups e lo sto usando, ma grazie alla tua risposta ho appena scoperto il nocciolo e sembra molto interessante ... – pgras

+0

Hazelcast è una griglia di dati in memoria, come risponde alla domanda dell'OP? – raffian

1

Il modo più semplice e assoluto - e più semplice a mio parere - per farlo è con ZeroConf!

Ogni nodo si annuncia e ascolta quando gli altri si presentano e spariscono. Nessun registro centrale, solo DNS multicast. Funziona molto bene - basta guardare OS X.

L'approccio portatile è quello di utilizzare jmdns - http://jmdns.sourceforge.net/ - il modo OS X è quello di utilizzare la facciata di Apple Java.

Problemi correlati