2008-09-09 10 views
11

Quelle est la meilleure méthode pour la communication inter processus dans une application java multithread.Meilleure pratique pour Java IPC

Il devrait être performant (donc pas JMS s'il vous plaît) facile à mettre en œuvre et fiable, de sorte que objets & les données peuvent être liées à un seul thread?

Toutes les idées sont les bienvenues!

+2

IPC est une "communication inter-processus". – WhyNotHugo

Répondre

9

En supposant que le scénario 1 JVM, plusieurs threads alors en effet java.util.concurrent est l'endroit à regarder, en particulier les différentes implémentations de file d'attente. Cependant, une abstraction en plus de cela peut être agréable et il Jetlang semble très intéressant, léger passage des messages Java.

15

Pourriez-vous clarifier un peu? Voulez-vous dire IPC dans une seule machine virtuelle Java? (Plusieurs threads, oui, mais au niveau de l'OS seulement un processus.) Ou voulez-vous dire plusieurs JVM? (Et vraiment OS-niveau pour les communications inter-processus.)

S'il est le premier, alors peut-être quelque chose de java.util.concurrent, comme ConcurrentLinkedQueue ferait l'affaire. (Je passe un message autour inbetween mes fils avec des classes de java.util.concurrent avec succès.)

Si plus tard, alors je vais deviner juste et suggère de jeter un oeil à RMI, bien que je ne » pense qu'il est qualifié de totalement fiable - vous devrez gérer cela un peu plus comme si vous étiez.

+0

RMI est de loin le meilleur moyen pour IPC entre différentes JVM. – trshiv

+0

Ce n'est pas toujours vrai. RMI peut être simple, mais cela nécessite que l'interface à partir de laquelle les stubs sont générés reste statique, sans modifications. Le choix de l'IPC dépend des besoins de l'application. Un mécanisme IPC de transmission de message pourrait être meilleur dans certains cas d'utilisation. – gpampara

+0

IPC est "communication inter-processus", Les classes de java.util.concurrent sont conçues pour plusieurs threads d'un processus unique, pas de processus différents. – WhyNotHugo

4

Je recommande de regarder dans l'ensemble du paquet java.util.concurrent, qui ont plusieurs classes pour faire face à la concurrence et différents moyens de communication entre les threads. Tout dépend de ce que vous voulez accomplir, car votre question est assez générale.

3

Vous devez utiliser une file d'attente producteur/consommateur. En faisant cela, vous évitez les pièges de la programmation multithread: les conditions de course et les deadlocks. De plus, ce n'est pas seulement plus facile et plus propre, mais aussi beaucoup plus rapide si vous utilisez une file d'attente sans verrou comme Disruptor ou MentaQueue. J'ai écrit un article de blog où je parle de cela en détail et montre comment obtenir < 100 nanosecondes latences: Inter-thread communication with 2-digit nanosecond latency.

3

Je viens d'ajouter MappedBus sur github (http://github.com/caplogic/mappedbus) qui est une bibliothèque IPC efficace qui permet à plusieurs processus/JVM Java de communiquer en échangeant des messages et qui utilise un fichier mappé en mémoire pour le transport. Le débit a été mesuré à 40 millions de messages/s.

Questions connexes