Как вы масштабируете сервер приложений, у которого есть задачи демона? - PullRequest
0 голосов
/ 22 мая 2011

У меня есть веб-приложение, которое сейчас работает на одном сервере.Я хотел бы перейти на кластер серверов приложений (Jetty), чтобы справиться с повышенной нагрузкой и отказоустойчивостьюОднако в приложении есть пара потоков демонов, которые запускаются раз в 10 минут для обработки поступивших данных. Эти данные должны обрабатываться только один раз (оно связывается с внешними серверами и вызывает проблемыпроизойдет, если это будет сделано дважды).

Каковы оптимальные методы для такого масштабирования?

Некоторые из вариантов, которые у меня есть:

  1. Естьфлаг того, должно ли приложение запускать задачи демона.Тогда только один из них с этим флагом установлен в true.Это работает, но это означает, что у меня больше нет простого переключения при сбое - мне нужно отслеживать этот специальный сервер приложений и предпринимать действия, если он выйдет из строя.

  2. Разработать какую-нибудь систему, где разные серверы приложенийзнать о каждом другом и иметь некоторый способ выбора узла для его запуска, например, все выбирают случайное число, и какой узел является самым старшим, получает для его запуска.Делайте это каждые 10 минут.Это имеет автоматический переход на другой ресурс (если другие узлы не могут обмениваться данными с одним узлом, потому что он не работает, он просто игнорируется), но это также означает, что каждый сервер приложений должен знать о каждом сервере приложений, и я чувствую, что заново изобретаюколесо здесь.

Как обычно обрабатывается эта ситуация?

Ответы [ 2 ]

1 голос
/ 22 мая 2011

Вы можете использовать Quartz для планирования ваших задач, он имеет поддержку кластеров .

Помимо планирования ваших задач в Quartz, вам придется создать базу данных (или использовать существующую) со схемой Quartz. Время на всех серверах в кластере должно быть синхронизировано (это сделает ntpd).

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

0 голосов
/ 22 мая 2011

Почему бы не использовать базу данных для координации? Любой узел, имеющий свободные циклы, может вставить строку «в процессе» в таблицу заданий, чтобы заблокировать другие узлы. Это использует тот факт, что вы, вероятно, уже полагаетесь на одну базу данных среди всех узлов, которая имеет встроенное управление транзакциями.

Вам нужно будет разработать простой алгоритм синхронизации, чтобы все узлы не просыпались в одно и то же время каждые десять минут и боролись за блокировку. Может быть, ввести случайную задержку в 0-10 секунд.

...