# RMI zur Skalierung?



## McTrevor (22. Jun 2007)

Hallo,

ich habe noch keine Erfahrung bezüglich RMI und wollte wissen, ob man dieses zur Skalierung einer Anwendung über mehrere Rechner nutzen kann. Man hat also einen steuernden Client und mehrere Server und der Client verteilt die arbeitsintensiven Aufträge auf die Server. Durch Hinzunahme weiterer Server müsste sich dieses System doch skalieren lassen, oder ist RMI für so etwas grundsätzlich nicht geeignet?

Bis dann denn!

McTrevor


----------



## EOB (22. Jun 2007)

hmmm...erfahrungen hab ich da auch nicht, aber klingt plausibel. was meinst du miteinem steuernden klinten?

grüße


----------



## McTrevor (22. Jun 2007)

Die Aufgabe lautet, anfallende Dateien(XML) zu analysieren, umzuwandeln und durch die Gegend (Netzwerk, also auch Komprimierung von Nöten) zu kopieren, sowie die enthaltenen Daten zum Schluss in eine DB einzutragen. Die Einsatzszenarien reichen dabei von einer moderaten Zahl an Dateien bis hin zu einem riesigen Datenaufkommen. Das ganze soll also über mehrere Rechner skalierbar sein. Dabei soll natürlich protokolliert werden, in welchem Status sich die einzelnen Datenpakete gerade befinden.

Die Steuerung des Datenflusses und die Protokollierung soll dabei nach meiner Vorstellung auf einem "Client" laufen, ist halt bedeutend einfacher dies zentral zu machen und nicht zu verteilen. Die eigentliche Arbeit, also das Umwandeln der Daten und das Schreiben in die DB würde ich dann gerne von mehrere Servern machen lassen per RMI.

Mir ist natürlich klar, daß das krass gegen das klassische Client-Server-Model verstößt, aber wie soll man es sonst umsetzen?

Die Frage bleibt aber, ob dies mit RMI möglich ist oder nicht? Und wenn es möglich ist, wäre ich für eine grobe Skizzierung dankbar (was sind typische Fallstricke, was muss man beachten wenn man mehrere Server bei der Registry anmelden will?).

Bis dann denn!

McTrevor


----------



## McTrevor (4. Jul 2007)

Niemand Ahnung, ob man mit RMI die last auf mehrere Server verteilen kann?

Bis dann denn!

McTrevor


----------



## tuxedo (4. Jul 2007)

Naja, du kannst quasi alles benutzen was die zu verarbeitenden Datenpakete übers Netzwerk verteilt. Ob du dafür dann RMI oder sogar Socket-Verbindungen benutzt sollte doch wurscht sein:

Der Rechner der die zu verarbeitenden XML-Pakete vorhält verteilt diese, Stück für Stück an Server die er in einer Liste führt. Ist ein Server mit der Verarbeitung fertig meldet er das Ergebnis zurück und es wird in die DB eingetragen (oder wie auch immer). 
Die Rückmeldung wie weit die jeweiligen Datenpakete schon verarbeitet sind lässt sich ebenfalls über Socket oder RMI machen.

Alles in allem: 

Das was du suchst ist keine zwingende Eigenschaft von RMI. RMI macht es sogesehen nur möglich Anwendungen auf verschiedenen Rechner auf Codeebene kommunizieren zu lassen. Mit Sockets funktioniert die Kommunikation einfach ein paar Levels weiter unten. 

Verstehe also nicht so ganz wieso du so auf RMI rumreitest. Die Lastverteilung musst du selbst machen. Egal ob du Sockets oder RMI benutzt. RMI und Sockets sind nur ein Mittel zum Zweck.

Zu der Skizziergeschichte:

> was muss man beachten wenn man mehrere Server bei der Registry anmelden will?

Naja, das ist definitionssache: Betrachte das ganze doch mal alá Seti@Home: Da gibt es den Seti-Server der die Datenpakete an teilnehmende Clients verteilt. Die Clients rechnen an den Datenpaketen rum und geben das Ergebnis am Ende zurück an den Server. 

Im Prinzip hast du nur einen Server, wie bei Seti. Und viele Clients die mit rechnen beschäftigt sind. Ergo musst du auch nur einen Server der RMI-Registry melden und hast halt viel Clients die sich mit dem Server verbinden. 

Darf ich fragen wieviel und was du schon alles mit Java realisiert hast? Mir scheints so dass du entweder den Wald vor lauter Bäumen nicht siehst oder dass du dich von der augenscheinlichen Komplexität der Aufgabe blenden lässt -> Divide and Conquer !!

Gruß
Alex


----------



## McTrevor (4. Jul 2007)

Anscheinend war mir diesbezüglich nur meine altertümliche Vorstellung vom Client-Server Modell im Weg. Es "fühlt" sich halt richtiger an, wenn die Server rackern und die Clients die Leistungen anfordern. Der Client als Arbeitstier ist mir halt noch nicht so geläufig.

Ich habe bis jetzt in Java nur wenige Projekte und diese in bescheidenem Hobbyumfang realisiert. Hatte darum mit Netzwerkprogrammierung und RMI im speziellen noch keinen Kontakt.

Aktuell überlege ich allerdings, obiges Unterfangen mithilfe eines JBoss-App-Servers umzusetzen, da dieser relativ leicht Clusterbildung ermöglicht und dies für die Anwendung quasi unsichtbar geschieht, soweit ich das bisher gelesen habe. Skalierbarkeit bekäme ich dann quasi "geschenkt".

Bis dann denn!

McTrevor


----------



## tuxedo (4. Jul 2007)

Naja, Geschenkt gibts nix... Mit dem JBoss-Server wird die Sache auch unweigerlich von Grund auf komplexer (IMHO). 

Wenn es einfach nur drum geht irgendwelche XML-Datenpakete "zu berechnen", zwischen drin den Status abfragen zu können, und am Ende ein Ergebnis zurück zu liefern, dann finde ich RMI ne schöne Lösung.

Clients verbinden sich mit dem Server (holen sich das Serverobjekt) und holen sich die Datenpakete (serverObject.getDataPackage(). Über ein RMI Callback (der Server hat ein Clientobjekt) frägt der Server in Intervallen (oder auf Anfrage eines Operators der sowas halt wissen will, dieser kann sich zB. auch als RMi-Client der "besonderen" Art mit dem Server verbinden) bei den Clients den aktuellen Berechungsstand ab (clientObject.getCurrentCalcStatus().

Du hattest geschrieben dass die Rechner, die das Ergenbnis errechnen, es auch in die DB eintragen sollen? Okay, dann hat der Server ja nur die Vermittlungsaufgabe für die Datenpakete ...

Passt doch...Denke das ist, abgesehen von der "Berechnung" der Pakete (kein Plan wie komplex das ist, musst du wissen), nicht schwer zu realisieren. 

Zur Skalierbarkeit: Tja, ganz einfach: Je mehr Clients sich beim Server anmelden/verbinden, desto mehr Rechenleistung steht zur verfügung. Ganz im Sinne des Boinc/Seti Projekts. Die Skalierbarkeit entsteht dadurch dass sich "beliebig" viele Clients am Server melden können und Datenpakete zur Berechnung anfordern.

Wenn sich jetzt aber 2 oder mehr Rechner ein und dieselbe Berechung teilen sollen, um z.B. die Berechnungszeit für ein Datenpaket zu verkürzen, dann wird das schon aufwendiger und bedarf einer guten Clusterbildung... 
Aber solange sich die einzelnen Berechunngen noch auf einzelne Rechner verteilen lassen seh ich da keinen Grund ein komplexes Cluster-System zu verwenden.

- Alex


----------



## McTrevor (5. Jul 2007)

Naja, die Aufgaben und Anforderungen sind insgesamt dann doch etwas umfangreicher, als von mir dargestellt. Es ist auch noch nicht ersichtlich, ob der Server evtl auch geclustert werden muss, da er sonst mit dem Verteilen der Aufträge nicht hinterherkommt.

Das es mit JBoss komplexer wird, glaube ich gerne, aber mit entsprechender Fachliteratur gehe ich von einer machbaren Herausforderung raus. Ausserdem verspreche ich mir davon, wertvolle Erfahrungen für die Zukunft zu sammeln und was zu lernen. Das ist mir den erhöhten Einarbeitungswaufwand wert.

Bis dann denn!

McTrevor


----------



## tuxedo (5. Jul 2007)

In dem Fall: Have some fun 

Gruß
Alex


----------

