Должно ли мое пользовательское планирование задач основываться на Spring или Quartz для моего варианта использования? - PullRequest
0 голосов
/ 10 октября 2019

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

К этим заданиям предъявляются следующие требования:

  1. Задание может планироваться с использованием большинства тех же функций запуска (фиксированная скорость, задержка, определение хрон и т. Д.), Что и@Scheduled.

  2. Задание может быть поставлено в очередь в течение длительного времени в некотором внешнем постоянном хранилище данных (например, в базе данных). Планировщик заданий принимает до N заданий и пытается их запустить. По завершении они удаляются из очереди;в случае сбоя вызывается обработка ошибок и задания ставятся в очередь (до M раз).

  3. Эти задания должны быть внешне синхронизированы, поскольку только один экземпляр службы должен получить конкретное задание. Это означает, что если служба A масштабируется до 10 экземпляров, задание все равно должно выполняться только одним экземпляром. В случае сбоя другой экземпляр может повторить задание.

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

Учитывая эти требования и в сочетании с тем, что мыИспользуя Spring / Spring Boot, я подумал, что лучшим способом будет расширить наборы интерфейсов TaskScheduler, Trigger и TaskExecutor с надлежащей логикой, которая нам необходима. Программная конфигурация, скорее всего, будет требованием для первой итерации этой внутренней «библиотеки заданий» из-за того факта, что каждая служба имеет требования к разным областям и может выполнять несколько заданий на разных частотах. На более поздней итерации может появиться что-то похожее на @Scheduled

Прочитав далее в Spring Docs, я увидел, что есть также поддержка Quartz . Кварц, похоже, имеет некоторую встроенную поддержку для исполнителей кластерных заданий через JDBCJobStore.

Поскольку я раньше не использовал Quartz, возникают вопросы: можно ли использовать Quartz для описанного выше варианта использования? Я бы все же предпочел для удобства обернуть сам Quartz API, но, конечно, предпочел бы его вручную выполнять выполнение кластерных заданий.

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