На веб-сайте электронной коммерции, на котором я работаю, мы используем Quartz.NET в службе Windows, называемой «Рабочий».Он выполняет реализации Quartz.NET IJob
по программно определенному расписанию и работает независимо от процессов веб-сайта.Он выполняет такие функции, как рассылка электронных писем в пакетном режиме, обновление статистики, обновление индексов SOLR и т. Д.
Таким образом, нам не нужно беспокоиться о том, что наши расписания будут сброшены или пропущены в результатепереработка рабочих процессов, или работа с безумием одновременного запуска нескольких экземпляров на одной машине в результате веб-сада.Worker устанавливается, запускается и останавливается независимо от веб-сайта и может даже существовать на отдельном компьютере, обеспечивая гибкость в обслуживании и развертывании.
Веб-сайт и Worker совместно используют общую библиотеку DLL модели, котораясодержит объектную модель и конфигурацию NHibernate, поэтому в ней не так много логического дублирования бизнес-логики.
До создания службы Worker / Windows я опирался на простые консольные приложения, которые выполнялись с помощью запланированных задач.До определенного момента это работало хорошо, но, поскольку сайт становился все более сложным и требовал периодического запуска все большего числа пакетных заданий, я обнаружил, что поддерживаю множество независимых консольных программ и множество независимых запланированных задач, которые становились все более трудными, посколькуколичество рабочих мест увеличилось.Консолидируя планирование с Quartz.NET в единую службу Windows, я теперь могу следить только за одним процессом и могу быть уверен, что любые изменения бизнес-логики «синхронизированы», поскольку модель должна обновляться только в двух местах:- рабочий и веб-сайт - вместо многих - веб-сайт и множество небольших консольных приложений.
Я исследовал такие варианты, как хранение сред выполнения в кэше ASP.NET или хранение ссылок в рабочем процессе.памяти, но я обнаружил, что (1) это сделало точное время выполнения задачи зависимым от входящих запросов на веб-сайт и (2) использование веб-сада вызвало ненужное дублирование усилий (поскольку задача была бы «запланирована»в нескольких рабочих процессах на одной машине).
Создание службы Windows, которую можно запускать и останавливать с помощью обычных механизмов Windows, оказалось, по моему скромному мнению, наиболее логичным, интуитивно понятным и поддерживаемым результатом в долгосрочной перспективе.
Как веб-сайт, так и Worker используют WiX для компиляции до двух MSI-файлов установщика Windows, поэтому их обновление очень просто - достаточно дважды щелкнуть MSI на сервере, и наше обновление готово.
Надеюсь, это поможет!