Балансировка нагрузки Quartz.Net через веб-сервис

Я новичок в Quartz.NET, поэтому, пожалуйста, потерпите меня здесь.

Я использую Quartz как часть сайта, работающего на кластере серверов. Чтобы облегчить балансировку нагрузки для заданий, они выполняют вызовы веб-службы (работающей на том же веб-сайте) через балансировщик нагрузки, чтобы гарантировать, что они выполняются на веб-сервере с наименьшей нагрузкой. Некоторые из этих заданий могут занять несколько часов. Проблема в том, что задание Quartz и веб-служба могут работать на разных компьютерах. Если компьютер, на котором выполняется задание Quartz, аварийно завершает работу, ожидая завершения веб-службы на другом компьютере, то Quartz не будет знать, выполнено ли задание без проблем. Я мог бы вызывать веб-сервис асинхронно, но тогда Кварц просто подумает, что задание выполнено успешно немедленно, независимо от того, что происходит в веб-сервисе. Это не позволит мне удостовериться, что одно и то же задание не выполняется одновременно, так как Quartz будет считать, что оно выполнено. Это также не позволяет повторять попытки при сбое и не позволяет мне видеть, какие задания выполняются в данный момент.

Есть ли в Кварце функция, которую я пропускаю? Кто-нибудь еще должен был справиться с подобной ситуацией? Есть ли лучший способ сбалансировать нагрузку кварцевых заданий?

Сейчас я думаю, что мне нужно изменить класс Quartz JobRunShell, чтобы он не устанавливал полный статус задания и триггера (не уверен, что это правильное место?). Затем разрешите моему веб-сервису устанавливать статусы после его завершения. Мне также нужно добавить код для обработки случаев, когда веб-сервис падает, и работа никогда не завершается. Для этого я планирую в своем веб-сервисе создать поток, который будет периодически сообщать Quartz о том, что задание все еще выполняется (через новое поле метки времени, которое я добавлю в базу данных). Мне придется периодически проверять запущенные задания, чтобы увидеть, запущены ли они (через новое поле), и если они не обновлялись в течение некоторого времени (скажем, 5 раз за период обновления), то я буду считать, что задание не удалось выполнить задание как неудачное и повторите попытку (если применимо).

Любая помощь / комментарии будут оценены.

РЕДАКТИРОВАТЬ: я использую Quartz.Net версии 2.3

1 ответ

Решение

Функция кластеризации кварца выполняет балансировку нагрузки самостоятельно. Если вы воспользуетесь этим, вы можете полностью избежать обращения к веб-службе. Вместо этого вы сконфигурируете свою работу для непосредственного запуска нужного вам кода, и кварцевая балансировка нагрузки выберет, какой компьютер будет выполнять работу в зависимости от нагрузки. Хотя поддержка кластеризации существует для quartz.net, только в java-версии документации по кварцу вы можете найти хорошее объяснение того, как это работает, на http://www.quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering

Чтобы кластеризация работала, вы должны установить quartz.jobStore.clustered=true и настройте ADO.NET JobStore

Другие вопросы по тегам