Кластерные серверы Jboss - ведение уникального счета - PullRequest
1 голос
/ 21 июля 2011

У нас есть веб-сервис, который принимает запросы с очень высокой частотой. Приложение развернуто на двух серверах jboss в кластере (для распределения нагрузки)

Мы обрабатываем запросы и определяем некоторые запросы как «хорошие запросы». Теперь мы хотим обработать определенный процент «хороших запросов» специально (отправить нисходящий поток в другую систему). Это процентное значение настраивается. Например, если процент составляет 75%, для каждых 4 «хороших запросов», которые мы получаем, 3 из них должны обрабатываться особым образом (отправляются в нисходящем направлении), а 4-й должен игнорироваться.

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


Вот решение, которое я подумал для этой проблемы.

  • Создайте очереди JMS на каждом сервере jboss и отправьте «хороший запрос» в очередь.
  • Другой модуль / приложение (имя: нисходящий модуль) будет читать очередь JMS. Он будет поддерживать count , чтобы определить, должен ли хороший запрос отправляться в нисходящем направлении или нет.

Количество - это количество запросов, полученных нижестоящим модулем


Существует несколько проблем, которые я предвидел при использовании вышеуказанного подхода, поскольку приложение развернуто на двух серверах.

  1. Счетчик не будет уникальным для двух серверов, каждый «нисходящий модуль» будет иметь свой счетчик.
  2. Поскольку счетчик не уникален, возможно, мы не отправляем настроенный процент. Например, если процент составляет 75% и если мы получаем 6 запросов. Возможно 3 пошли к server1 и 3 пошли к server2. Количество в каждом «последующем модуле» будет 3. Таким образом, мы бы эффективно не отправили хотя бы 1 «хороший запрос» в нисходящую систему, что нежелательно.

Я думал, что я буду вести таблицу в базе данных, которая будет вставлять "хорошие запросы" и генерировать для этого уникальный номер (Good_request_count), а также использовать Good_request_count в каждом "последующем модуле", чтобы принять решение о том, должен ли он быть лечили специально или нет.


Но я боюсь, что мое решение очень неэффективно, поскольку оно будет включать следующее

  1. Наличие двух очередей JMS (по одной для каждого jboss)
  2. На каждом сервере должно быть два «нисходящих модуля», чтобы определить, нужно ли отправлять исправный запрос нисходящему.
  3. Каждый последующий модуль должен вставить некоторое ключевое значение в «хороший запрос» и прочитать уникальное значение счетчика из базы данных.

Основная проблема заключается в том, что у меня есть два сервера, и я хочу получить уникальный счетчик для обоих.

Может кто-нибудь предложить мне лучшее решение или указать мне неэффективность системы, которую можно улучшить.

Пожалуйста, дайте мне знать, если я не совсем уверен, я могу это объяснить.

Спасибо большое за чтение!

1 Ответ

2 голосов
/ 22 июля 2011

Вот две другие стратегии, которые следует рассмотреть:

  1. Создайте MBean, содержащий код, который ведет подсчет, и разверните его в каталоге deploy-hasingleton на каждом сервере в вашем кластере.Вы можете ссылаться на MBean через поиск JNDI, и гарантировано, что только один его экземпляр будет доступен для всего кластера.

  2. Если вы используете более свежую версию JBoss, выесть возможность использовать сессионный EJB-сеанс для отслеживания количества.

...