Как я могу делать основанные на времени / запланированные события в .NET? - PullRequest
8 голосов
/ 19 июня 2009

Мне нужно предложить планирование действий / событий на нашем веб-сайте. Аналогом дерьма может быть система календаря, в которой человек добавляет элемент календаря, а когда дата / время «ударили», то срабатывает некоторая логика (например, вычисление отчета).

У меня могут быть сотни и даже тысячи запланированных событий, которые вводят мои клиенты. Когда клиент вводит что-то по расписанию, я сохраню эту информацию в базе данных. Тогда я предполагаю, что я добавил куда-нибудь событие / задание, которое будет содержать первичный ключ таблицы базы данных. когда событие будет запущено, я возьму эту информацию из БД, а затем сделаю логику. сделано.

Какие есть общие решения для этого?

Я использую .NET 3.5 SP1. БД - Sql Server 2008. Тем не менее, пользовательский интерфейс будет иметь веб-интерфейс.

Я не был уверен, что люди используют MSMQ? Или что-то встроенное в Sql Server? Или какая-нибудь библиотека с открытым исходным кодом (например, Quartz.NET ) со службой NT. Сервер будет Windows 2008 Standard Edition.

Также - пожалуйста, не предлагайте использовать эквивалент задания cron или любые сценарии командной строки и т. Д.

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

ура :) 1017 *

edit: логика для обработки, когда требуется запуск события, являются фоновыми заданиями. Пользовательский интерфейс не требуется.

Ответы [ 8 ]

4 голосов
/ 19 июня 2009

Workflow Foundation может сделать это. Используйте Задержка , установите TimeSpan в (DesiredTimeOfExecution - Now). Для более масштабных систем установите UnloadOnIdle в значение true, и ожидающие рабочие процессы будут сохраняться до тех пор, пока не понадобятся

Вот очень простой пример Задержки .

WF - Бесплатно , входит в состав .NET Framework 3.0.

2 голосов
/ 01 июля 2009

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

Quartz.NET также обеспечивает необходимое распределение и отработку отказа с функциями кластеризации. Одна приятная особенность - также настраиваемые для каждого триггера настройки обработки пропуска зажигания, которые дают вам возможность реагировать на пропуски зажигания и время простоя планировщика.

Похоже, что SQL Service Broker имеет преимущество отсутствия опросов. Интересно, будет ли это когда-либо проблемой, хотя у брокера есть недостаток в звучании немного сложнее (по крайней мере из описания, которое я прочитал выше).

Только мои предвзятые $ 0,02.

2 голосов
/ 19 июня 2009

Что вам нужно, так это SQL Server Service Broker.

Вы можете осуществлять синхронизированный доступ к базе данных для запроса данных календаря и т. Д. Он основан на сообщениях, более мощный, чем MSMQ, не требует опроса и может использоваться в распределенных средах, если вам это нужно. Прекрасно работает для меня!

Вы нажмете хранимую процедуру, чтобы поместить информацию о вашем событии в очередь SSB в БД. В будущем вы дадите этому сообщению время для пробуждения и обработки другой хранимой процедуры, которая захватывает данные вашего события и помещает в очередь на получение, которая выполняет «внешнюю активацию». EA отправляет уведомление службе Windows, которая указывает на консольное приложение. Это консольное приложение получает информацию о событии из очереди получения. Теперь у вас есть данные о вашем событии в то время, когда вы этого хотите. Обработайте его так, как вам нравится в консольном приложении.

Существует кривая обучения, но она того стоит, если вам нужна надежность, гибкость и масштабируемость, которые предлагает SQL Service Broker. Ниже приведены ссылки для начала работы.

Вот сравнение: SQL Service Broker и MSMQ

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

Надеюсь, это поможет!

1 голос
/ 19 июня 2009

Это уже обсуждаемая проблема в StackOverflow. пройдите Нужен планировщик заданий в asp.net

Вы забыли добавить самую важную информацию в свой вопрос - ASP.Net

В нем описана структура планировщика для веб-приложений ASp.Net, которая может работать как служба и дает вам метод, который периодически вызывается, а затем вы можете запускать логику для загрузки событий, ставить в очередь действительные с помощью таймеров.

Кроме того, это самая дешевая из всех альтернатив. Надеюсь, это то, что вам нужно.

1 голос
/ 19 июня 2009

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

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

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

Ваша проблема будет в масштабируемости в зависимости от количества пользователей, количества задач, которые они ставят в очередь, и того, насколько интенсивной (время, память, процессор и т. Д.) Может быть разрешена каждая задача. Если бы я был тобой, я бы отодвинул 1-минутную гранулярность времени на 5 минут. Что нужно сделать в 1:38 вечера? что вы не можете ждать до 1:40 вечера. за? :)

1 голос
/ 19 июня 2009

Одним из вариантов может быть создание задания SQL для выполнения с любым наиболее детальным интервалом и обработка всех ваших событий.

Если вам нужно лучшее из мира .NET и SQL Server, вы можете использовать задания SQL и также вызывать управляемый код . У меня нет опыта работы с этим решением, поэтому я заранее прошу прощения, если предоставленный мною ресурс не очень тщательный.

Если задачи очень сложные, и вы не хотите загружать сборки на SQL Server или вам просто не нравится их система планирования, то я бы порекомендовал .NET Windows Service со сторонним плагином планировщика. Лично, если бы весь код мог быть сохранен в хранимой процедуре или в серии хранимых процедур, я бы выполнил задание, так как считаю, что им намного легче управлять, и большая часть работы для вас уже выполнена.

Редактировать

Я только что заметил комментарий, объясняющий детализацию. Если у вас есть какие-то действия, которые нужно выполнять каждую минуту, тогда решение .NET Service, вероятно, будет проще, поскольку вам, вероятно, придется реализовать какое-то многопоточное решение.

0 голосов
/ 19 июня 2009

Тогда, я думаю, я добавлю куда-нибудь событие / задание, которое будет содержать первичный ключ таблицы базы данных. когда событие будет запущено, я возьму эту информацию из БД, а затем сделаю логику.

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

SELECT * FROM Events WHERE Events.Time < next_minute
0 голосов
/ 19 июня 2009

Это немного зависит от характера системы. Исходя из предположения, что полное определение событий хранится в базе данных:

  • Если событие должно вызывать что-то в веб-интерфейсе, при обновлениях проверьте таблицу на наличие записей, которые «произошли», и добавьте соответствующие визуальные индикаторы / экраны / всплывающие окна к следующему выводу веб-запроса.
  • Если ваши события связаны с фоновой обработкой, самое простое решение - написать отдельное автономное приложение .NET, которое опрашивает таблицу событий базы данных на предмет новых записей и проверяет по часам, какие события произошли. Вы можете придумать что-нибудь интересное и задействовать многопоточность, если некоторые события вызывают длительные процессы и т. Д., Но это будет основной дизайн. (Используйте многопоточность, только если вам нужно ... простое однопоточное приложение, которое опрашивает таблицу, будет наиболее надежным)
...