2010-09-28 1 views
0

Я разрабатываю веб-приложение ASP.NET 4.0, где администраторы могут создать аукцион с истечением срока действия. Время истечения срока хранения будет храниться в базе данных. Как я могу гарантировать, что аукцион заканчивается в заданное время, учитывая тот факт, что экземпляр приложения не может быть запущен, когда настало время? Приложение будет размещено в IIS7. Я рассматриваю службу Windows, но мне интересно, какие другие варианты там есть.Каков предпочтительный метод управления событием с течением времени с помощью веб-приложения?

ответ

2

Служба Windows, которая обрабатывает синхронизированные события, будет лучшей практикой. Использование System.Threading.Timer в ASP.NET - плохой juju; он МОЖЕТ работать в вашем случае, потому что внесенное изменение не влияет на интерфейс пользователя напрямую, но я бы не поставил на него работу безупречно. Если вам нужно планировать события на фоне веб-приложения, используйте серверное приложение.

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

+1

Почему так много потоков? за каждый аукцион? почему не только первый истекает? –

+0

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

2

Если вы хотите, чтобы он был на 100% надежным, то служба Windows, которая выполняет всю запланированную логику, - это путь. Как вы говорите, вы не можете доверять веб-приложению, так как оно может даже не работать.

4

Вы можете выбрать один из двух сценариев здесь:

  • Ленивые с веб-приложением
  • Активный с сервисом

Ленивый Сценарий

Если вы не должны взаимодействовать мгновенно с победителем аукциона вы можете подождать, пока приложение начнется, а затем пусть приложение dete rmine, если есть аукционы, срок действия которых истек. Соберите их на , чтобы момент и обрабатывать их соответственно.

Активный сценарий

Создать сервис, который выбирает первый истекающую аукцион из БД. Храните этот DateTime и дайте услуге спать до окончания аукциона. Поднимите службу в этот DateTime и обработайте истекающий аукцион. Затем позвольте службе искать следующий аукцион (ы), чтобы истечь, и позволить службе снова спать. И дальше и дальше .. Думаю, The Windows Workflow Foundation содержит все инструменты и требования для этой практики.

Что-то между

Активизировать планировщик, который будит вас веб-приложение каждый час/полчаса/15 минут и делать ленивые вещи. Используйте планировщик, например, HostMonitor.

+0

+1. Хорошее резюме, не мог написать его лучше – citronas