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). P>
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 p>
Qu'est-ce dont j'ai besoin: p>
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. P>
C'est tout! P>
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. P>
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. p>
Alors la question est, Comment puis-je faire cela? P>
4 Réponses :
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. P>
Bien sûr, cela ne vous dira pas quand une instance diminue. Vous avez deux choix pour cela: p>
Vous aurez besoin de 1-2 threads pour surveiller cela et déclencherez des événements appropriés. P>
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.
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. p>
Une option plus établie est JGRoups Ceci sous licence sous la LGPL. P>
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?
Je recommanderais certainement jgroups qui est assez gentil et très em> 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. p>
Une autre option serait Apache Mina mais Jgroups est meilleur pour la découverte (car elle prend en charge tout type de découverte ). p>
Les jgroups sont beaux et j'ai également trouvé des tribus Apaache à travers une autre chaîne. Merci un tas! :)
Testé JGRoups CODE> 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?
La voie la plus simple absolue - et la plus simple à mon avis - de faire cela est avec Zeroconf! P>
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. P>
L'approche portable consiste à utiliser jmdns - http://jmdns.sourceforge.net/ - le OS X Way est d'utiliser la façade de pomme Java. P>