# RMI ohne Security



## pups (10. Feb 2011)

Hallo,

ich will ein bestehendes Projekt, das viel Kommunikation im Netzwerk betreibt auf RMI umstellen.

Problem: Ich habe mich noch nie mit RMI befasst, daher wär es super wenn mir jemand Feedback geben kann ob mein Vorhaben überhaupt klappt. Nicht, dass ich nach 2 Wochen merke, dass Garnichts mehr läuft.

Fragen:
1. Muss ich diesen SecurityManager laden, wenn alle Teilnehmer im Netzwerk auf der gleichen Codebasis laufen?

2. Im Moment Sender alle Teilnehmer Nachrichten wo drinnen steht wer sie sind "id", was sie sind "typ" und was sie gerne machen würden. Alles als langer String mit festgelegten Trennzeichen. Ist natürlich ein riesiger Codeblock alle Objekte in Strings zu verwandeln. Das kann ich mit RMI ablösen und vereinfachen?

3. Im Moment hat jeder Teilnehmehmer einen eigenen Thread um mit anderen Teilnehmern zu reden, so wird verhindert, dass wenn es mal irgendwo langsamer zugeht, das Gesamtsystem nicht gebremst wird. Kann RMI nebenläufig sein, ab dem Moment wo man eine Funktion aufruft? Also gar nicht wartet bis die Nachricht übertragen ist? Sind im dem Zusammenhang bei RMI auch irgendwo maximale Befehlsschlagen definiert? So wie eine LinkedBlockingQueue, das nicht irgendwann mal n HeapSpace fliegt, weil bei einem Server n Kabel gezogen wurde o.Ä?

Freue mich auch auf Teilantworten.

Vielen Dank


----------



## FArt (11. Feb 2011)

Wenn du RMI benutzen möchtest, dich aber nicht auskennst, würde ich Spring Remoting empfehlen. Einfach POJO implementieren, das Interface "exposen" und fertig.
Wenn es wirklich besser asynchron sein sollte, würde ich JMS vorschlagen.


----------



## chalkbag (11. Feb 2011)

pups hat gesagt.:


> Fragen:
> 1. Muss ich diesen SecurityManager laden, wenn alle Teilnehmer im Netzwerk auf der gleichen Codebasis laufen?


Du kannst RMI auch ohne Security Manager verwenden, hängt nach meinem Wissensstand aber auch davon ab, was du verschickst, also z.B. einfache Strings oder Objekte.



pups hat gesagt.:


> 2. Im Moment Sender alle Teilnehmer Nachrichten wo drinnen steht wer sie sind "id", was sie sind "typ" und was sie gerne machen würden. Alles als langer String mit festgelegten Trennzeichen. Ist natürlich ein riesiger Codeblock alle Objekte in Strings zu verwandeln. Das kann ich mit RMI ablösen und vereinfachen?


Deutlich, die Kommunikation erfolgt ja über ein bis beliebig viele Interface, wodurch du ja nur noch die Methoden aufrufen musst.



pups hat gesagt.:


> 3. Im Moment hat jeder Teilnehmehmer einen eigenen Thread um mit anderen Teilnehmern zu reden, so wird verhindert, dass wenn es mal irgendwo langsamer zugeht, das Gesamtsystem nicht gebremst wird. Kann RMI nebenläufig sein, ab dem Moment wo man eine Funktion aufruft? Also gar nicht wartet bis die Nachricht übertragen ist? Sind im dem Zusammenhang bei RMI auch irgendwo maximale Befehlsschlagen definiert? So wie eine LinkedBlockingQueue, das nicht irgendwann mal n HeapSpace fliegt, weil bei einem Server n Kabel gezogen wurde o.Ä?


Es ist bei der Thematik egal ob du Sockets oder RMI verwendest. Du kannst den Server ja immer mit oder ohne Nebenläufigkeit implementieren. Der Entwickler entscheidet so, ob wohl nur ein Thread pro Verbindung oder eben zusätzlich welche für einzelne "aufwändige" Funktionen verwendet werden sollen.


[persönliche Meinung]
Ich finde es gibt viele gute Einführungen in RMI so das man ja relativ schnell in rmi reinkommt. Es ist so fraglich ob es leichter ist sich direkt mit RMI zu beschäftigen, oder mit einem evtl. überdimensionierten Framework (bei welchem ich auch zumindest die RMI Technologie verstanden haben sollte?).
[/persönliche Meinung]


----------



## tuxedo (11. Feb 2011)

pups hat gesagt.:


> Hallo,
> 
> ich will ein bestehendes Projekt, das viel Kommunikation im Netzwerk betreibt auf RMI umstellen.



Wieviel ist denn viel? 10 calls/sekunde? 100calls/sekunde? 1000calls/sekunde? 10000calls/sekunde?




> Problem: Ich habe mich noch nie mit RMI befasst, daher wär es super wenn mir jemand Feedback geben kann ob mein Vorhaben überhaupt klappt. Nicht, dass ich nach 2 Wochen merke, dass Garnichts mehr läuft.



Naja, je nach Projektgröße und Art wirst du schon ein paar Tage für den Umbau investieren müssen. Und dann sollte man noch ausgiebig testen um böhse Überraschungen zu verhindern...



> Fragen:
> 1. Muss ich diesen SecurityManager laden, wenn alle Teilnehmer im Netzwerk auf der gleichen Codebasis laufen?



Geht meines wissens auch ohne SecurityManager.



> 2. Im Moment Sender alle Teilnehmer Nachrichten wo drinnen steht wer sie sind "id", was sie sind "typ" und was sie gerne machen würden. Alles als langer String mit festgelegten Trennzeichen. Ist natürlich ein riesiger Codeblock alle Objekte in Strings zu verwandeln. Das kann ich mit RMI ablösen und vereinfachen?



Ja, das ist ja der Sinn hinter diesen RPC Techniken. Du kommunizierst dann einfach "objektorientiert". Streams, Bytes, etc... ist dann alles Geschichte.



> 3. Im Moment hat jeder Teilnehmehmer einen eigenen Thread um mit anderen Teilnehmern zu reden, so wird verhindert, dass wenn es mal irgendwo langsamer zugeht, das Gesamtsystem nicht gebremst wird. Kann RMI nebenläufig sein, ab dem Moment wo man eine Funktion aufruft? Also gar nicht wartet bis die Nachricht übertragen ist? Sind im dem Zusammenhang bei RMI auch irgendwo maximale Befehlsschlagen definiert? So wie eine LinkedBlockingQueue, das nicht irgendwann mal n HeapSpace fliegt, weil bei einem Server n Kabel gezogen wurde o.Ä?



RMI beherrscht Nebenläufigkeit. Aber halt nur solange du in deinem Aufbau mit all den Klassen und Aufrufen das auch beherrschst. RMI verwaltet die internen Threads zur Kommunikation nach einem mir unbekannten Verfahren selbst. Du hast keinen wirklichen einfluss darauf wieviele Threads arbeiten und wieviele Netzwerkverbindungen benutzt werden.
Eine Alternative wäre hier SIMON (siehe Signatur).

In beiden Fällen (RMI und SIMON): Wenn du eine entfernte Methode aufrufst, dann blockiert der Aufruf solange bis der entfernte Methodenaufruf beendet ist. Eben ganz genau so, wie wenn du lokal eine Methode aufrufst. Das dauert solange wie es eben dauert die Methode abzuarbeiten. Du kannst natürlich den Methodenaufruf auf Serverseite in einen Threadpool (Executorservice) weiterleiten und dort den Aufruf weiter verarbeiten lassen. Dann hast du das entkoppelt. Der Aufruf dauert dann nur noch solange, wie es dauert um die Daten zur Verarbeitung in den Threadpool zu stecken. Allerdings hat der Aufrufende dann keine ahnung was aus seinen Daten wird/geworden ist. Der Server muss also ggf. einen Callback zurück zum Aufrufenden benutzen um das Ergebnis mitzuteilen. Wenn die Anwendung über's Internet laufen soll, dann ist unter Umständen das hier lesenswert: SIMON - Start - root1.de - Software Engineering

Der Heap fliegt dir in der Regel nicht um die Ohren. Sowohl RMI als auch SIMON (für andere kann ich nicht sprechen, da kenn ich die Frameworks zu wenig) prüfen aktiv die Verbindung (das Intervall ist einstellbar). Sollte eine Störung vorliegen (Kabel gezogen, Routerausfall, unendlich große Latenz), wird das entsprechend erkannt.


----------



## FArt (11. Feb 2011)

chalkbag hat gesagt.:


> [persönliche Meinung]
> Ich finde es gibt viele gute Einführungen in RMI so das man ja relativ schnell in rmi reinkommt. Es ist so fraglich ob es leichter ist sich direkt mit RMI zu beschäftigen, oder mit einem evtl. überdimensionierten Framework (bei welchem ich auch zumindest die RMI Technologie verstanden haben sollte?).
> [/persönliche Meinung]


Wieso überdimensioniert?

Sehe ich nicht so. Mit dieser relativ schlanken API habe ich mehrere Vorteile, u.a. die Verwendung von RMI (oder einem anderen Protokoll) ohne mich mit RMI direkt auseinandersetzen zu müssen. Das ist eine Frage des Anspruchs. Möchte ich RMI lernen und benutzen, dann mache ich alles selber. Möchte ich einfach nur Remotezugriffe über das RMI Protokoll erledigen, bin ich mit Spring schneller bei einer funktionierenden und guten Lösung, da ich mich um die Kommunikation gar nicht kümmern muss, sondern nur um die Businesslogik.


----------



## tuxedo (11. Feb 2011)

FArt hat gesagt.:


> Möchte ich einfach nur Remotezugriffe über das RMI Protokoll erledigen, bin ich mit Spring schneller bei einer funktionierenden und guten Lösung, da ich mich um die Kommunikation gar nicht kümmern muss, sondern nur um die Businesslogik.



Das klingt ja fast so, als ob man bei RMI und Co. 'nen haufen Kommunikationsrelevantes Zeug erledigen muss.

Dabei ist es auf Serverseite doch prinzipiell nur das Anlegen der Registry und Binden des Objekts, und auf Client-Seite der Lookup für das Objekt. Fertig. Wenn man's eng zusammenpackt sind das pro Seite ne Handvoll Zeilen.

Okay, was bei RMI noch "unschön" ist, ist dass man um alles und jeden Call einen Try/Catch Block packen muss. Wen das noch stört der kann sich ja tatsächlich von RMI abwenden und eine Alternative wählen.

Aber davon mal abgesehen, ist der "Overhead" durch RMI sicher nicht größer als der von irgend einer anderen RPC Technik. Denn schließlich muss man ja irgendwann und irgendwo mal sagen wer mit wem etc...

- Alex


----------

