PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kommunikation von Servern untereinander im selben Netzwerk


gereggter Gast
2007-04-14, 02:49:11
Hallo,

wie können x gleiche Applikationen auf x unterschiedlichen Servern (Tomcat) im selben Netzwerk miteinander kommunizieren? Die Kommunikation kann dabei sehr spartanisch ausfallen. Wahrscheinlich würde das senden eines Wertes genügen.

Anfangs hatte ich daran gedacht, dass bei Eintritt eines gewissen 'Ereignisses' (geschieht bei den Berechnungen der Applikation) ein Wert in einer Datenbank - auf die alle Applikationen Zugriff haben - gesetzt wird und jede Applikation dann vor Antritt einer neuen Berechnung überprüft, ob dieser Wert in den letzten paar Minuten in der Datenbank gesetzt wurde. Wenn ja, soll die Applikation das machen. Wenn nein, dann jenes.
Dies würde allerdings dazu führen, dass vor jeder Berechnung überprüft werden muss, ob das 'Ereignis' eintrat oder nicht. Unschön also, zumal der DB-Zugriff auch nicht gerade billig ist.

Schöner fände ich es, wenn der Server mit dem 'Ereignis' einfach eine Nachricht an die anderen Server schickt und die Applikationen darüber informiert.

Welche Möglichkeiten der Kommunikation gibt es? Links, Wiki-Artikel oder Suchhinweise würden mir schon reichen. :smile:
Bessere Lösungsansätze sind natürlich auch gerne gesehen. :biggrin:

gruß,
gereggter Gast

Monger
2007-04-14, 09:11:52
Hm, das hört sich für mich doch verdächtig nach einer Anwendung für Multicast an. Sieh dir mal das an:
http://java.sun.com/docs/books/tutorial/networking/datagrams/broadcasting.html

Wenn es wirklich nur um ein paar Werte geht, halte ich eine Datenbank für deutlich zu überdimensioniert. Da tut es auch einfach ein simpler Dienst der auf jedem Rechner läuft, und den Serverdienst von Zeit zu Zeit mal anfragt. Der Server hält dann die Daten einfach im RAM. Das werden ja hoffentlich nur ein paar Byte sein.

gereggter Gast
2007-04-14, 12:09:32
Hm, das hört sich für mich doch verdächtig nach einer Anwendung für Multicast an. Sieh dir mal das an:
http://java.sun.com/docs/books/tutorial/networking/datagrams/broadcasting.html

Wenn es wirklich nur um ein paar Werte geht, halte ich eine Datenbank für deutlich zu überdimensioniert. Da tut es auch einfach ein simpler Dienst der auf jedem Rechner läuft, und den Serverdienst von Zeit zu Zeit mal anfragt. Der Server hält dann die Daten einfach im RAM. Das werden ja hoffentlich nur ein paar Byte sein.Wenn ich mir die Beschreibung von Multicastsocket durchlese, scheint es nicht ganz das zu sein, was ich suche.
Die Etablierung einer Serverapp wollte ich eigentlich umgehen, stattdessen sollte jede der x Applikationen gleichzeitig als Client und Server dienen, welche Nachrichten senden als auch empfangen kann. Bei dem Broadcasting - wenn ich es richtig verstanden habe :| - fragt der Client nach einem Datenpaket von dem Server. Dieser reagiert darauf und sendet entsprechend Daten. Dies wäre dann der Fall, den ich verhindern wollte, dass vor jeder Berechnung nachgefragt werden muss, ob das 'Ereignis' eintrat.
Auch müßte man dann umständlicherweise zwei Receive-Methoden schreiben. Eine wird ausgeführt, wenn das 'Ereignis' bei einer der Applikationen auftrat und der Server darüber informiert wird. Die zweite Methode halt, die vor jeder Berechnung ausgeführt wird.

Was mir vorschwebt ist eine Art ping, welches die jeweilige Applikation, ähm, pinged und die anderen Applikationen empfangen das ping und wissen Bescheid: "ahh, das Ereignis. :eek:". Daten müssen nicht mal gesendet werden.

Monger
2007-04-14, 17:44:15
Bei dem Broadcasting - wenn ich es richtig verstanden habe :| - fragt der Client nach einem Datenpaket von dem Server. Dieser reagiert darauf und sendet entsprechend Daten.

In deinem Fall wäre halt jeder Rechner ein Multicastserver und zugleich Client. Jeder Rechner hört gleichzeitig die selbe Adresse auf Daten ab, und jeder kann Daten senden. Ich weiß nicht ob es die eleganteste Möglichkeit ist, aber eigentlich müsste es so gehen.

gereggter Gast
2007-04-14, 21:14:31
In deinem Fall wäre halt jeder Rechner ein Multicastserver und zugleich Client. Jeder Rechner hört gleichzeitig die selbe Adresse auf Daten ab, und jeder kann Daten senden. Ich weiß nicht ob es die eleganteste Möglichkeit ist, aber eigentlich müsste es so gehen.Ahh, ich glaub, jetzt verstehe ich es langsam.
Jeder der x Applikationen hört - weil sie den Client beinhalten - auf einen gewissem Port 'YYY' und erhalten die Nachrichten, welche an die Gruppe 'gruppe' gerichtet sind.
Jeder der x Applikationen kann - weil sie ebenfalls Server sind - eine Nachricht an 'gruppe' (über dem Port 'YYY') senden.

Dann erhält zwar auch der, der bereits weiß, das das 'Ereignis' eintrat, eine Nachricht, aber dies ist nicht schlimm.
Moment, wenn er auf dem Port sendet, kann er ja nicht gleichzeitig auf dem Port empfangen.
Moment :eek:, können die Applikationen überhaupt auf dem Port senden, wenn sie dauernd auf diesem hören? Hmm, ich müsste den Client für diesen Moment stoppen, dann die Nachricht senden und anschließend den Client wieder starten.
Hmm, klingt doch eigentlich ganz gut und kann ohne viel Aufwand betrieben werden. :smile: Ich glaub, das wird es (wenn nicht auch noch eine Möglichkeit für die 'ping'-Variante existieren sollte), danke Monger.

Monger
2007-04-15, 01:14:03
Ich bin in Netzwerksachen nicht so fit, aber afaik sind ausgehende Ports ohnehin immer anders als eingehende.

Wenn du dich mit deinem Firefox auf den Port 80 verbindest, ist damit ja der Serverport gemeint, nicht der Clientport. Für den Clientport wird irgendeine freie Adresse oberhalb des reservierten Bereichs (10000 irgendwas) vergeben.

Die gibt man halt nicht an, weil für die sich ohnehin keiner interessiert. Und die kann ja auch ständig wechseln, je nachdem wieviele Client Dienste man gerade laufen hat.

Probier es einfach mal mit unterschiedlichen Ports aus. Eigentlich muss das gehen.