Я разрабатываю веб-приложение ASP.NET 4.0, где администраторы могут создать аукцион с истечением срока действия. Время истечения срока хранения будет храниться в базе данных. Как я могу гарантировать, что аукцион заканчивается в заданное время, учитывая тот факт, что экземпляр приложения не может быть запущен, когда настало время? Приложение будет размещено в IIS7. Я рассматриваю службу Windows, но мне интересно, какие другие варианты там есть.Каков предпочтительный метод управления событием с течением времени с помощью веб-приложения?
ответ
Служба Windows, которая обрабатывает синхронизированные события, будет лучшей практикой. Использование System.Threading.Timer в ASP.NET - плохой juju; он МОЖЕТ работать в вашем случае, потому что внесенное изменение не влияет на интерфейс пользователя напрямую, но я бы не поставил на него работу безупречно. Если вам нужно планировать события на фоне веб-приложения, используйте серверное приложение.
Одно дело иметь в виду; вы можете иметь сотни или тысячи открытых аукционов одновременно. Если вы установите таймер на каждом аукционе, когда он будет открыт, у вас будут сотни или тысячи спящих потоков, управляемых этим сервером. Я бы посмотрел только на аукционы, которые закончились бы до следующего раза, когда вы обычно проводите опрос, и установите таймеры только для этих аукционов. Это привело бы вас к нескольким десяткам ожидающих потоков. Если вы пишете следующий eBay, пусть даже это задохнется, когда вы получите сотни тысяч или миллионы аукционов, и несколько сотен или тысяч начинаются и заканчиваются каждую минуту.
Если вы хотите, чтобы он был на 100% надежным, то служба Windows, которая выполняет всю запланированную логику, - это путь. Как вы говорите, вы не можете доверять веб-приложению, так как оно может даже не работать.
Вы можете выбрать один из двух сценариев здесь:
- Ленивые с веб-приложением
- Активный с сервисом
Ленивый Сценарий
Если вы не должны взаимодействовать мгновенно с победителем аукциона вы можете подождать, пока приложение начнется, а затем пусть приложение dete rmine, если есть аукционы, срок действия которых истек. Соберите их на , чтобы момент и обрабатывать их соответственно.
Активный сценарий
Создать сервис, который выбирает первый истекающую аукцион из БД. Храните этот DateTime и дайте услуге спать до окончания аукциона. Поднимите службу в этот DateTime и обработайте истекающий аукцион. Затем позвольте службе искать следующий аукцион (ы), чтобы истечь, и позволить службе снова спать. И дальше и дальше .. Думаю, The Windows Workflow Foundation содержит все инструменты и требования для этой практики.
Что-то между
Активизировать планировщик, который будит вас веб-приложение каждый час/полчаса/15 минут и делать ленивые вещи. Используйте планировщик, например, HostMonitor.
+1. Хорошее резюме, не мог написать его лучше – citronas
Почему так много потоков? за каждый аукцион? почему не только первый истекает? –
Это тоже работает. Для загруженного сайта вы, вероятно, все же хотите иметь несколько потоков, отслеживающих следующий и конец, и все, что закончится в следующие несколько секунд после этого. Дело в том, что не создавайте поток таймера для каждого аукциона. – KeithS