2008-09-09 6 views
11

Was ist die beste Methode für Interprozesskommunikation in einer Multithread-Java-App.Best Practice für Java IPC

Es sollte performant sein (also keine JMS bitte) einfach zu implementieren und zuverlässig, so dass Objekte & Daten nur an einen Thread gebunden werden können?

Irgendwelche Ideen willkommen!

+2

IPC ist "Interprozesskommunikation". – WhyNotHugo

Antwort

9

Angenommen, das Szenario 1 JVM, mehrere Threads dann tatsächlich java.util.concurrent ist der Ort zu schauen, insbesondere die verschiedenen Queue-Implementierungen. Allerdings kann eine Abstraktion obendrein schön sein und dort sieht sehr interessant aus, leichte Java Message Passing.

15

Könnten Sie ein wenig verdeutlichen? Meinst du IPC in einer einzigen JVM? (Mehrere Threads, ja, aber auf Betriebssystemebene nur ein Prozess.) Oder meinen Sie mehrere JVMs? (Und wirklich OS-Level-Interprozesskommunikation.)

Wenn es das erste ist, dann vielleicht etwas aus java.util.concurrent, wie ConcurrentLinkedQueue würde den Trick tun. (I Nachricht passieren um zwischendurch meine Fäden mit Klassen von java.util.concurrent mit Erfolg.)

Wenn das später, dann werde ich nur erraten und schlagen einen Blick auf RMI nehmen, obwohl ich don‘ denke, dass es sich als absolut zuverlässig erweist - du müsstest das ein bisschen mehr "Hands on" machen wie.

+0

RMI ist bei weitem der beste Weg für IPC zwischen verschiedenen JVMs. – trshiv

+0

Das stimmt nicht immer. RMI ist zwar einfach, erfordert jedoch, dass die Schnittstelle, aus der Stubs generiert werden, unverändert bleibt. Die Wahl des IPC hängt von den Anforderungen der Anwendung ab. Ein IPC-Nachrichtenübermittlungsmechanismus könnte in einigen Anwendungsfällen besser sein. – gpampara

+0

IPC ist "Interprozesskommunikation". Die Klassen in java.util.concurrent sind für mehrere Threads eines einzelnen Prozesses ausgelegt, nicht für verschiedene Prozesse. – WhyNotHugo

4

Ich empfehle das gesamte java.util.concurrent-Paket, die mehrere Klassen für den Umgang mit Nebenläufigkeit und verschiedene Kommunikationsmittel zwischen Threads haben. Alles hängt davon ab, was Sie erreichen möchten, da Ihre Frage ziemlich allgemein ist.

3

Sie sollten eine Producer/Consumer-Warteschlange verwenden. Dadurch vermeiden Sie die Fallstricke der Multithread-Programmierung: Rennbedingungen und Deadlocks. Außerdem ist es nicht nur einfacher und sauberer, sondern auch viel schneller, wenn Sie eine blockierungsfreie Warteschlange wie Disruptor oder MentaQueue verwenden. Ich habe einen Blogartikel geschrieben, in dem ich ausführlich darüber spreche und zeige, wie man < 100 Nanosekunden Latenzzeiten erreicht: Inter-thread communication with 2-digit nanosecond latency.

3

Ich habe gerade MapedBus auf Github (http://github.com/caplogic/mappedbus) hinzugefügt, die eine effiziente IPC-Bibliothek ist, die mehrere Java-Prozesse/JVMs durch Austausch von Nachrichten ermöglichen und eine Memory-Mapped-Datei für den Transport verwendet. Der Durchsatz wurde auf 40 Millionen Nachrichten/s gemessen.