2017-01-23 20 views
0

Я хотел бы создать планировщик заданий. Таким образом, этот планировщик заданий позволяет пользователю настроить:Создайте планировщик заданий в C#

  1. Начало работы. (Значение даты и времени)
  2. Частота работы: минуты, часы, дни, месяцы, годы (любое целое число)

У меня есть 2 варианта, как строить этот планировщик:

  1. Используйте C# Класс таймера. Но это также означает, что я должен создать новый объект Timer для каждого запланированного задания. Я планирую выставить конечную точку API для вызова пользователем и POST информацию о времени начала и частоте. Поэтому, когда вызывается конечная точка, мне нужно будет создать новый объект Timer. Будет ли это даже масштаб? Как управлять объектами Timer? Мне нужно разрешить пользователю создавать, обновлять и удалять свои задания.

  2. Использовать Azure Scheduler. Однако у меня очень большая база данных пользователей. Я посмотрел на цены, максимальные общие задания, которые могут выполняться в одном экземпляре, составляют только 5 миллионов рабочих мест. Кроме того, мне сложно управлять работающими экземплярами, если у меня работает более одного экземпляра. Как я могу решить загрузить баланс нескольких экземпляров планировщиков?

+1

Вы можете с некоторой математикой обрабатывать несколько запланированных заданий с помощью одного таймера ... –

+0

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

+0

Если вы хотите создать его самостоятельно, просто запустите один таймер и проверьте, сколько осталось времени для следующей итерации запланированного задания и обновлять его каждый раз. Например, если вы запускаете свой таймер каждую секунду (может быть, слишком часто) и попадаете на задание, которое нужно начинать сейчас, добавьте одну минуту и ​​сохраните его в качестве следующего времени выполнения, а при каждом тике галочка вы проверите, прошло ли это время. В противном случае для этого есть хорошие библиотеки, см. Мой ответ ниже. –

ответ

0

Вы можете использовать роли Azure работника, один работник роль каждого типа работы, а также различные графики для каждого задания, пользователи могут создавать свой собственный отдельный график для каждого задания, выбирая из списка предопределенных «типов заданий».

+0

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

0

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

Подробнее здесь: https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html

Для вашей задачи вы просто указать сторону производителя, который работает, если будет Ставить задачи в RabbitMQ с некоторой графикой без заботы о том, как они выполняют в мессенджере. Таким образом вы можете добавлять, удалять, редактировать, читать расписания в своем продюсере. Кроме того, небольшой совет, а не частота условия использования cron-выражения. Это широкая поддержка, простая в понимании концепция для определения человеко-читаемых графиков.

Подробнее здесь: https://crontab.guru/

0

Есть существующие библиотеки, которые можно использовать, например, Quartz или Hangfire. Первая из них довольно проста в использовании библиотеки, которую я успешно использовал, у последней есть пользовательский интерфейс, помимо запускаемых задач и т. Д., Которые вы можете обслуживать.

Я уверен, что есть много других библиотек, если они недостаточно хороши.

1

Derek here from Azure Scheduler. У нас есть корпоративные клиенты, использующие планировщик, аналогичные описанным вами сценариям, в зависимости от того, как выглядит ваш пользователь/профиль работы, должно быть легко создать хороший способ разделить их на разные сбор работ.

Сколько рабочих мест вы ожидаете?Похоже, вам нужно гораздо больше, чем 5 миллионов, которые мы поддерживаем в одной коллекции работ с планом P20. Я хотел бы лучше понять ваш сценарий и помочь вам решить, является ли Azure Scheduler правильным решением.

Вы можете связаться со мной по адресу Derek.Li (at) microsoft dot com.