Как программно найти / перечислить все узлы в J2EE Application-Cluster? - PullRequest
6 голосов
/ 06 декабря 2010

Есть ли способ найти все узлы, принадлежащие кластеру веб-приложения? Я знаю, что на JBoss я могу использовать HAServiceMBeanSupport для получения информации обо всех узлах (имя хоста, IP-адрес), но как мне добиться чего-то похожего на Tomcat, WebSpere, Glassfish, Oracle AS, Jetty, WebLogic? (Лучше всего будет интерфейс, который работает для всех из них)

Ответы [ 2 ]

0 голосов
/ 22 марта 2018

Не существует стандартного выпадающего решения для того, что вы просите.
Технически это может быть достигнуто многими способами - как внутри Java-экосистемы, так и за ее пределами, например. Формирование кластера Jgroups, Zookeeper или простой Redis или другой K / V-сервер, где каждый экземпляр сервера регистрируется при запуске и подписывается на изменения в группе кластера.
Поддержка и необходимые усилия будут отличаться. Общий подход состоял бы в том, чтобы использовать некоторый крюк запуска, например Инициализация контейнера сервлета или EJB @Startup @Singleton для связи со службой обнаружения топологии (например, с вашим сервером redis), для предоставления информации о вашем экземпляре и запроса информации о других уже активных экземплярах. Если вам нужны выборы лидера, вы можете использовать множество алгоритмов, например, первым пришел - первым обслужен или основан на голосовании. Затем вам нужно подписаться и активно выслушивать изменения в топологии и, возможно, предоставить какую-то метрику здоровья - например, периодически сообщайте другим, что ваш экземпляр все еще активен В целом, не могли бы вы уточнить, зачем вашему приложению нужны знания о других экземплярах того же типа? Нужны ли вам выборы Master или единый кластер HA? Лучшая практика для построения стабильных масштабируемых решений - держать приложение в режиме без состояния и не знать о деталях масштабирования.

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

Большинство поставщиков серверов JEE предлагают для этого какое-то специальное решение, например Служба JBoss HASingleton или однокомпонентное развертывание HA (приложение всегда будет работать только на одном экземпляре в кластере), которое также заботится о восстановлении после отказа.

0 голосов
/ 06 декабря 2010

Насколько я знаю, это зависит от возможностей вашего сервера приложений.

Для этого не существует "стандартного пути".

Вы можете попробовать следующее:

Класс ServletContextListener имеет два метода.Вы можете вычислить имя хоста и IP-адрес (а) в методе create и удалить узел в методе destroy.

В этом случае возникают проблемы во время VM-сбоя, метод destroy не будет вызванНапример,

РЕДАКТИРОВАТЬ: нужна ли вашей программе база данных?Если это так, все кластерные узлы должны использовать один и тот же экземпляр базы данных.Если ваше приложение развернуто без кластера, оно использует «частную» базу данных.Вам нужна общая БД:

Таблица: NODES


HOST |IP


as1.cluster |

as2.cluster |

Если в эту БД вставлена ​​только одна строка, кластера нет.

Но эта таблица может быть повреждена, если происходит сбой узла и не удаляется его записьэта таблица.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...