У меня есть слой идентичных серверов приложений за балансировщиком нагрузки. По оперативным причинам у меня есть ограничение на то, что конфигурация приложения на обоих серверах приложений должна быть одинаковой, чтобы можно было легко добавлять и удалять узлы. Все серверы приложений используют одну и ту же базу данных. Серверы приложений не кластеризуются/не будут.
Это отлично работает до сих пор, но теперь я хотел бы иметь запланированное задание, которое выполняется на одном из серверов приложений. Все серверы приложений будут запускать Quartz и иметь одинаковое расписание для выполнения заданий. Триггер будет запускаться на каждом сервере приложений, но я бы хотел, чтобы только один сервер приложений фактически выполнял задание - по сути, все они запускались, и только один фактически запускается, остальные серверы приложений просто игнорируют работу. Идея здесь в том, что если мы потеряем сервер приложений, другой будет запускать задание вместо этого, и если мы добавим новые серверы приложений, они приступят к выполнению заданий.
Я планировал это сделать, имея таблицу "блокировки заданий" в базе данных, которую все серверы приложений будут читать до начала работы, и только начинать, если задание "разблокировано". Сервер приложений, который делает обновление первым в таблице, по существу блокирует других, обновляя таблицу до состояния работы/сбросив ее в конце задания.
Прежде чем я построю это, я был бы признателен за вклад тех, у кого больше опыта Quartz:
a) Могу ли я подключить это поведение к кварцу, чтобы его не нужно было выполнять на основе работы? То есть разработчики могут добавлять новые задания, не беспокоясь о блокировке работы, поскольку они абстрагируются.
b) Предоставляет ли кварц какие-либо встроенные механизмы для достижения чего-то подобного выше, поэтому мне не нужно самостоятельно его качать?
Спасибо!