2009-12-09 3 views
7

В настоящее время я участвую в проекте, в котором мы/приложение должны иметь возможность обнаруживать другие экземпляры приложения с тем же именем приложения, которое работает в локальной сети (в дальнейшем называемое узлом).API-интерфейс Discovery для Java-приложения

Предпосылки: Все узлы знают, что их собственный IP-адрес и TCP-порт номер Все узлы имеют имя Все узлы имеют доступ к локальной сети

Что мне нужно:

Все узлы нужно знать IP-адрес и TCP-порт друг друга. Если узел уходит, я должен быть проинформирован об этом программно. Если появится новый узел, мне придется программно уведомить об этом. ЭТО НЕОБХОДИМО, что серверу или другому приложению не нужен, он должен быть API, который я могу интегрировать в текущее приложение. Кроме того, он должен быть с открытым исходным кодом и предпочтительно иметь лицензию MIT или ApacheV2.

Вот и все!

Приложение основано на JVM, поэтому любой API будет работать. Я смотрел на ZooKeeper, но, похоже, это довольно большая зависимость от небольшой функциональности, в которой мы нуждаемся.

И, если вы не знаете какого-либо API, но имеете некоторые хорошие ссылки, чтобы поделиться тем, как достичь этого, написав его сам (белые документы, блоги, книги и многое другое), я бы более чем с радостью принял вещи как это.

Вопрос в том, Как мне это сделать?

ответ

5

Я определенно рекомендую JGroups который довольно хорошо и очень активно работать и поддерживает любой тип обнаружения (IP Multicast, фиксированный список, внешний сервис поиска и т.д.) по сравнению с любым видом транспорта.

Другим вариантом будет Apache MINA, но JGroups лучше для обнаружения IMO (потому что он поддерживает любое обнаружение).

+1

JGroups выглядят хорошо, и я также нашел Apache Tribes через другой канал. Огромное спасибо! :) –

+0

проверил 'JGroups' и получил сообщение от пользователей сетевой безопасности моей компании, заявив, что плохой трафик поступает с моей машины ... Это из-за многоадресной передачи IP, я думаю? – andrii

2

Если вы все в одной подсети, простым решением было бы использовать multicast sockets. Выберите адрес (ну, сделайте его настраиваемым), а затем, когда новый экземпляр запустится, он отправит многоадресный «ping». Это уведомляет другие серверы.

Конечно, это не скажет вам, когда произойдет сбой. У вас есть два варианта:

  1. Пинг часто достаточно, чтобы, когда вы не получили пинг в течение определенного времени, вы предполагаете, что экземпляр не работает; или
  2. Когда вы получили уведомление о новом экземпляре, вы открываете TCP-соединение с этим экземпляром. Вы должны пинговать этот сокет гораздо реже, чтобы его открывать (бездействие по-прежнему его убивает), и вы можете быть уведомлены о его закрытии с другой стороны или о семантике TCP для тайм-аута сокета.

Вам понадобятся 1-2 потока, чтобы контролировать это и запускать соответствующие события.

+0

Абсолютно Cletus, дело в том, что построение его с нуля с помощью примитивных строительных блоков (с ручным приводом и т. Д.), Вероятно, увеличит риск того, что решение имеет крайности и надежность, возможно, страдает. Вот почему я надеялся использовать репутацию на плечах какого-то гиганта :) –

+1

Я знаю, что вы имеете в виду, но кажется, что каждый раз, когда я ищу библиотеку для решения небольшой, но сложной проблемы, вы просто торгуете одним набором угловых случаев для набор угловых случаев, характерных для библиотеки. – cletus

+1

@Cletus - посмотрите на ZeroConf - это то, что вы описали, сделанное правильно и качество продукции. –

1

Существует множество возможностей для такого рода вещей, мой любимый человек hazelcast - это лицензия Apache и имеет нулевые зависимости и минимальную конфигурацию.

Более установленный вариант: jgroups это лицензия под LGPL.

+0

Gid, это выглядит интересно, спасибо за подсказку. –

+0

Я знал о jgroups, и я использую его, но, благодаря вашему ответу, я только что нашел hazelcast, и это выглядит очень интересно ... – pgras

+0

Hazelcast - это сетка данных в памяти, как она затрагивает вопрос OP? – raffian

1

Абсолютно простой способ - и простейший, на мой взгляд, сделать это с помощью ZeroConf!

Каждый узел объявляет себя и слушает, когда другие появляются и исчезают. Нет центрального реестра, только многоадресной DNS. Работает очень хорошо - просто посмотрите на OS X.

Портативный подход заключается в использовании jmdns - http://jmdns.sourceforge.net/ - путь OS X - использовать фасад Apple Java.