Frage

Ich habe die Frage gesehen: Kommunikation zwischen zwei separaten Java-Desktop-Anwendungen (Antwort: JGroups) und ich denke an etwas mit JavaGroups oder gerade RMI aber die Geschwindigkeit der Umsetzung ist von fundamentaler Bedeutung. Ich schicke keine großen Mengen an Daten um (Inhalt von MIDI-Meldungen, so je 3 Bytes, nicht mehr als etwa zwei Meldungen alle drei Millisekunden), und diese werden alle auf der gleichen Maschine sein. Ist es zu glauben, daft, dass RMI / JGroups auf derselben physischen Maschine langsam sein?

(Mein Gedanke ist, dass ich nicht mehr als 1 ms Latenz leisten können, da ich schon einige habe, aber ich bin nicht sicher, wie man am besten Vortrag über die Geschwindigkeit in diesem Zusammenhang.)

Ich denke, meine Frage ist: gibt es keine Optionen für InterApp Kommunikation in Java, die schneller durch etwas gehen als TCP / IP Ich meine Dinge bereits in Java implementiert, nicht JNI Möglichkeiten, dass ich‘ d Notwendigkeit zu implementieren:)

Ich weiß, nicht optimize früh und so weiter, aber auch besser als Nachsicht.

War es hilfreich?

Lösung

  

Gibt es Möglichkeiten für InterApp Kommunikation in Java, die schneller durch etwas gehen als TCP / IP?

Nicht signifikant ... AFAIK.

Aber ich denke, Sie darüber denken, den falschen Weg. Unter der Annahme, dass Sie kleine Nachrichten bewegen, wird die Hauptleistungskiller sind die Gemeinkosten machen einen Anruf anstatt die Geschwindigkeit, mit der Bytes bewegt. Diese Overhead umfassen solche Dinge wie die benötigte Zeit, zu machen Systemaufrufen, Prozesskontexte auf dem Client und Server-Seite zu wechseln, um Prozessnachrichtenpaket-Header innerhalb des Kernels und zum Routen von Paketen. Und jeder synchronen RPC-ähnliche Interaktion führt zu einer Anruf ein Warten auf die Antwort zu machen; das heißt die App -> Server -> Umlaufzeit.

Der Weg zu mehr bekommt Durchsatz auf dem folgenden konzentrieren:

  • die Anzahl der RPCs zu reduzieren, dass die Anwendung erfordert; z.B. durch die Kombination von ihnen mehr grobkörnig, und

  • zu sein
  • sucht nach Wegen, synchrone Interaktionen in asynchrone Interaktionen zu drehen; z.B. Verwendung Nachricht basiert, anstatt RPC-basierten Technologien.

Andere Tipps

Wenn die Geschwindigkeit des Wesens ist, sollten Sie den Anruf im selben Thread machen. Sie werden nicht so schnell, wie dies mit einem Netzwerk.

Allerdings Geschwindigkeit unter der Annahme ist nicht ganz so wichtig, dass Sie Java RMI Anrufe in etwa 500 Mikrosekunden durchführen können und benutzerdefinierten codierte RPC verwenden Sie Anrufe über Loopback in etwa 24 Mikrosekunden machen. Auch Daten zwischen Threads in der gleichen JVM geben kann 8 Mikrosekunden dauern.

Sie müssen entscheiden, wie viel Zeit Sie bereit sind, ein Netzanruf zu ermöglichen, zu platzieren. Sie müssen auch entscheiden, ob die Zeit, um den Anruf zu starten ist kritisch oder die Zeit, um ein Ergebnis zurückzukehren. (Oft ist die letztere hat die doppelte Kopf)

Hinweis: Ich spreche Mikrosekunde hier, nicht Milli Sekunden. Ich würde alle Optionen ignorieren, die für Ihre Zwecke mehrere Millisekunden dauern.

Dieser Benchmark über zwei Jahre alt, aber es zeigt, dass die einzige populäre Java-Remote Lösung schneller als RMI ist hessischen 2 (die immer noch in beta glaube ich).

Allerdings, wenn Ihre Nachrichten nur in einstelligen Bytes sind, unter Verwendung eines beliebigen remoting Lösung scheint übertrieben, vor allem, wenn die Prozesse auf der gleichen Maschine sind. Ich würde empfehlen, sie zu einem einzigen Prozess, wenn möglich, zu konsolidieren. Sie können auch nur mit plain old Java-Sockets betrachten.

  

Ist es zu glauben, daft, dass RMI / JGroups auf derselben physischen Maschine langsam sein?

Wenn Ihre Maschine wahrscheinlich ja anständig :) Wenn Sie auf einem Computer mit Tonnen von Prozessen laufen CPU essen usw. dann könnte es auch anders sein. Wie immer zu finden ist der beste Weg, wenn Sie die gleiche Sache erfahren würden, wie ich es zu testen ist.

Im Folgenden ist die Zeit in Millisekunden mit Nanotime in der gleichen JVM genommen zu senden, um die Zeichenfolge „123“ mit rmi und auf dem Server concat es mit „abc“ zu bekommen "123abc" und es zurück.

Kalt JVM: ca. 0,25 Millisekunden Latenz

0.250344
0.262695
0.241540
0.282461
0.301057
0.307938
0.282102

Warm JVM. Ca. 0,07 Millisekunden Latenz

0.87916
0.72474
0.73399
0.64692
0.62488
0.59958
0.59814
0.66389

Sie würden also gut sein, innerhalb von 1 ms, wenn der RMI-Server und Client wird lokal ausgeführt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top