7
votes

API de la mécanique de découverte pour l'application Java

Je participe actuellement à un projet où nous / l'application doit pouvoir découvrir d'autres instances de l'application avec le même nom d'application exécuté sur un réseau local (désormais appelé noeud).

Prérequis: Tous les nœuds connaissent leur propre adresse IP et son numéro de port TCP Tous les nœuds ont un nom Tous les nœuds ont accès à la LAN

Qu'est-ce dont j'ai besoin:

Tous les nœuds doivent connaître l'adresse IP et le port TCP de l'autre noeud. Si un nœud tombe en panne, je devrai être informé de manière programmatique de cela. Si un nouveau noeud se présente, je devrai être informé de manière programmatique de cela. Il est essentiel qu'aucun serveur maître ou une autre application n'est nécessaire, il doit s'agir d'une API que je peux m'intégrer dans l'application actuelle. De plus, il doit être open source et de préférence MIT ou Apachev2 sous licence.

C'est tout!

L'application est basée sur JVM, donc toute API fera. Je regarde Zookeper, mais cela semble être une grande dépendance à la petite fonctionnalité dont nous avons besoin.

et, si vous ne connaissez aucune API, mais que vous avez de bons liens à partager comme comment y parvenir en l'écrivant moi-même (papiers blancs, blogs, livres, ce que je n'accepterais pas volontiers des choses comme cet aswell.

Alors la question est, Comment puis-je faire cela?


0 commentaires

4 Réponses :


2
votes

Si vous êtes tous sur le même sous-réseau, une solution simple serait d'utiliser Prises de multidiffusion . Choisissez une adresse (bien, faites-la configurable), puis quand une nouvelle instance démarre, elle envoie une multidiffusion "ping". Cela notifie les autres serveurs.

Bien sûr, cela ne vous dira pas quand une instance diminue. Vous avez deux choix pour cela:

  1. ping assez souvent que lorsque vous ne recevez pas de ping pendant une certaine quantité de temps, vous supposez que l'instance est en panne; ou
  2. Lorsque vous êtes informé d'une nouvelle instance, vous ouvrez une connexion TCP à cette instance. Vous devez ping cette prise beaucoup moins souvent pour le garder ouverte (l'inactivité le tuera encore éventuellement) et vous pouvez être informé de celui-ci étant fermé par l'autre côté ou la sémantique TCP pour le délai d'attente de prise.

    Vous aurez besoin de 1-2 threads pour surveiller cela et déclencherez des événements appropriés.


3 commentaires

Absolument Cletus, la chose est que la construction de zéro avec des blocs de construction primitifs (battements de coeur mainourdi, etc.) augmentera probablement le risque que la solution ait des cas de bord et une fiabilité en souffre peut-être. C'est pourquoi j'espérais avoir un effet de levier debout sur les Silders de certains géants :)


Je sais ce que tu veux dire, mais il semble que chaque fois que je vais chercher une bibliothèque pour résoudre un problème petit mais complexe, vous échangez simplement un ensemble de cas d'angle pour un ensemble de cas de coin spécifique à la bibliothèque.


@ClTeus - Jetez un coup d'œil à Zeroconf - c'est ce que vous décrivez bien et de qualité de production.



1
votes

Il y a un tas d'options pour ce genre de chose, ma personne préférée est hazelcast c'est Apache licencié et a zéro dépendances et un minimum de configuration.

Une option plus établie est JGRoups Ceci sous licence sous la LGPL.


2 commentaires

Je savais des jgroups et je l'utilise, mais merci à votre réponse, je viens de découvrir Hazelcast et ça a l'air très intéressant ...


Hazelcast est une grille de données en mémoire, comment répond-il à la question de l'OP?



5
votes

Je recommanderais certainement jgroups qui est assez gentil et très activement travaillé activement sur et prend en charge tout type de découverte (multidiffusion IP, liste fixe, service de recherche externe, etc.) sur tout transport.

Une autre option serait Apache Mina mais Jgroups est meilleur pour la découverte (car elle prend en charge tout type de découverte ).


2 commentaires

Les jgroups sont beaux et j'ai également trouvé des tribus Apaache à travers une autre chaîne. Merci un tas! :)


Testé JGRoups et a reçu un message de la sécurité réseau de mon entreprise, disant que le mauvais trafic vient de ma machine ... C'est à cause de la multidiffusion IP, je suppose?



1
votes

La voie la plus simple absolue - et la plus simple à mon avis - de faire cela est avec Zeroconf!

Chaque noeud annonce et écoutez quand d'autres apparaissent et disparaissent. Aucun registre central, juste MultiCast DNS. Fonctionne extrêmement bien - il suffit de regarder le système d'exploitation x.

L'approche portable consiste à utiliser jmdns - http://jmdns.sourceforge.net/ - le OS X Way est d'utiliser la façade de pomme Java.


0 commentaires