Qu'est-ce qu'un bon mécanisme de communication maître-esclave basé sur Java?

je crée une application Java qui nécessite une communication maître-esclave entre les JVM, peut-être résidant sur la même machine physique. Il y aura un serveur" maître "tournant à L'intérieur D'un serveur D'application Java EE (i.e. JBoss) qui aura des clients" esclaves " connectés à celui-ci et qui s'enregistrera dynamiquement pour la communication (c'est-à-dire que le maître ne connaîtra pas les adresses IP/ports des esclaves et ne pourra donc pas être configuré à l'avance). Le serveur maître agit comme un contrôleur d'dole travail aux esclaves et les esclaves répondront périodiquement avec des notifications, donc il y aurait communication bidirectionnelle.

je pensais à l'origine à des systèmes basés sur RPC où chaque côté serait un serveur, mais cela pourrait devenir compliqué, donc je préférerais un mécanisme où il y a une socket ouverte et ils parlent de part et d'autre.

je suis à la recherche d'un mécanisme de communication qui serait une faible latence où les messages seraient principalement des types primitifs, donc aucun sérieux la sérialisation est nécessaire. Voici ce que j'ai regardé:

  • RMI
  • JMS: intégré à Java, les clients" esclaves " se connecteraient au répertoire de connexion existant dans le serveur d'application.
  • JAX-WS/RS: le maître et l'esclave seraient des serveurs exposant une interface RPC pour la communication bidirectionnelle.
  • JGroups / Hazelcast: utiliser des structures de données partagées pour faciliter la communication.
  • Memcached / MongoDB: utilisez-les comme les" files d'attente " pour faciliter la communication, même si les clients devaient effectuer un sondage pour qu'il y ait une certaine période de latence.
  • Thrift: cela semble garder une connexion persistante, mais pas sûr de savoir comment intégrer / intégrer un serveur Thrift dans JBoss
  • WebSocket / Raw Socket: cela fonctionnerait, mais nécessiterait beaucoup plus de code personnalisé que je ne le voudrais.

y a-t-il une technologie qui me manque?

Edit: aussi regardé:

  • JMX: Demandez au client de se connecter au serveur JMX de JBoss et de recevoir des notifications JMX pour les comms bidirectionnelles.
20
demandé sur Arjan Tijms 2010-04-07 22:15:08

11 réponses

Eh bien, je suggère JMS si vous cherchez quelque chose qui est basé sur Java. Il a toutes les fonctionnalités que vous recherchez plus un serveur d'application fort comme JBoss. Cependant, une autre option qui n'est pas entièrement basée sur java et qui n'utilise pas les Files d'attente serait D'utiliser le protocole HTTP et JAXB (RESTful Web services). C'est une façon très légère de communiquer entre les deux côtés. Vos objets seraient transformés en XML en utilisant JAXB, et seraient transférés de l'autre côté, et ensuite vous le rejetez pour objecter une fois que vous le recevez.

5
répondu paradisonoir 2010-04-08 22:00:33

honnêtement, je m'en tiendrais au JMS. Vous avez une file d'attente de vos esclaves peuvent prendre des messages, et une file d'attente qu'ils les remettre dans le. Vous pouvez définir des propriétés sur qui a traité chaque message (pour la comptabilité) directement sur l'enveloppe. Vous obtenez la persistance avec de nombreux fournisseurs de J2EE (glassfish, jboss).

de plus, vous pouvez facilement passer à JVM distribué sur plusieurs serveurs sans programmation supplémentaire.

Cependant, il peut ne pas correspondre à la définition de "à faible latence" dans certains cas.

4
répondu Chris K 2010-04-07 19:27:23

deux autres options:

Zookeeper (http://hadoop.apache.org/zookeeper/) Ne L'ont pas utilisé, mais semble approprié ici. RabbitMQ (http://www.rabbitmq.com/) mise en file D'attente des messages de faible latence. Beaucoup de flexibilité.

3
répondu nojo 2010-04-07 19:21:54

si vous êtes à la recherche de performances et que vos deux applications sont java, sans pare-feu entre les deux, vous pouvez immédiatement exclure tous les protocoles basés sur XML. Si la communication est synchrone (master attend que l'esclave termine le travail), alors utilisez RMI, sinon JMS. Vous pouvez également utiliser TCP directement pour une performance maximale. S'il y a beaucoup d'esclaves qui reçoivent le même message, vous pouvez regarder dans les boîtes à outils de communication de groupe comme JGroups ou Spread (plus rapide mais pas 100% Java.) En fin de compte, vous pourriez découvrir que d'autres personnes ont déjà construit ce que vous essayez de construire. Jetez un oeil à Gridgain.

3
répondu Jaksa 2011-05-27 10:00:25

vous pouvez également vérifier Mule. Je pense que c'est la solution parfaite pour votre problème.

1
répondu Kamahire 2011-05-25 12:12:21

nous avons une application similaire, et nous venons D'utiliser Servlet sur JBoss avec "slaves" le frapper d'une manière avec minuterie. C'est bien, mais pas optimal pour une faible latence.

nous étudions maintenant Netty. Vous pouvez utiliser le protocole que vous voulez utiliser.. Nous utiliserons probablement HTTP et JAXB. Je suppose que cela pourrait être classé comme "WebSocket / Raw Socket", mais c'est beaucoup mieux que d'utiliser un raw..

0
répondu Enno Shioji 2010-04-07 18:23:50

vous pourriez vouloir jeter un oeil à activable. Si les esclaves répondent lorsque le travail est terminé alors rmi et activable pourrait être une bonne solution dans ce cas. Si vous utilisez le rmiregistry sur le controller, alors tous les esclaves peuvent s'enregistrer avec le controller facilement, et ceux-ci peuvent être activés si nécessaire.

0
répondu Finbarr 2010-04-07 18:33:09

en fonction de vos besoins, vous pouvez trouver que le Socket brut a moins code que les autres approches. Il aura certainement la plus faible latence. Vous pouvez le faire descendre à environ 20 micro-secondes sur boucle arrière.

plus vous avez d'exigences, plus vous êtes susceptible de vouloir une solution de haut niveau. Cependant, si tout ce que vous voulez est quelque chose de léger, les prises brutes peuvent être les plus simples.

0
répondu Peter Lawrey 2011-05-30 17:51:03

pour le service thrift, vous pouvez utiliser TServlet comme point d'entrée pour votre service Thrift. Ce que vous avez décrit ressemble plus à un problème à résoudre avec activemq ou zookeeper.

0
répondu jfarrell 2011-10-28 18:55:09

WebSockets vous aidera avec la communication entre le serveur Web et le client, pas entre deux JVM. Si c'est en fait ce que vous voulez, http://fermiframework.org fournit une java-JavaScript (du serveur vers le client) RMI.

0
répondu Forelight 2014-03-25 20:18:21

Vous pouvez aussi jeter un oeil à Redisson projet il a publier / s'abonner et d'autres structures de données distribuées partagées pour répondre à vos besoins.

0
répondu Nikita Koksharov 2017-03-19 18:51:40