Подтвердить что ты не робот

Мысли о запуске приложений типа Windows Service на ASP.NET 4 с StartMode = "AlwaysRunning"

Обычно я хотел бы написать службу Windows для управления задачами, которые не подходят для размещения в веб-приложении. Эти типы задач обычно представляют собой длительные процессы или запланированные задачи. Хотя это обычно является основным подходом к этим задачам, люди рассматривали способы запуска таких фоновых процессов в веб-приложении путем ногами отключить несколько потоков в событии Application_Start, выставленном Global.asax. Проблема с этим подходом всегда заключалась в том, что, если ваш рабочий процесс IIS умирает, ваш фоновый поток также убивается (эффективно ваша "служба Windows" останавливается до получения следующего запроса).

ASP.NET 4.0 предлагает решение этой проблемы. Теперь вы можете установить StartMode на "AlwaysRunning", как описано в этом сообщении в блоге Скотта Гу. Где-то в комментариях к этому сообщению кто-то задает вопрос о целесообразности размещения задач типа Windows Service в IIS, поскольку новая функция обеспечивает рабочий процесс всегда работает. Скотт упомянул, что это определенно поддержит сценарий. В дополнение к этому недавнее введение AppFabric означает, что сами Microsoft предоставляют простые перехваты для хостинга и мониторинга WCF и WF-сервисов в веб-приложении.

Что это значит для тех из нас, кто использовал для написания Windows Services для поддержки наших веб-приложений? Должна ли мы принять эту модель? Каковы подводные камни? Насколько я могу судить, существует ряд преимуществ для хостинга процессов "Windows Service" в веб-приложении, причем наиболее полезным является простота развертывания. Кроме того, мы можем начать разработку простых пользовательских интерфейсов для наших сервисов, которые предоставляют информацию о том, что происходит во время выполнения.

Если бы мне пришлось идти по этому маршруту, я не думаю, что я бы использовал функции типа "Служба Windows" в клиентском веб-приложении. Я бы, вероятно, разработал новый проект веб-приложений (как и в контексте Windows Service), который будет содержать мои длительные/запланированные задачи. Думаю, для этого мало причин.

  • Безопасность. Может существовать другая модель безопасности для пользовательского интерфейса, отображающего информацию о текущих фоновых процессах. Я бы не хотел раскрывать этот интерфейс никому другому, кроме команды ops. Кроме того, веб-приложение может работать как другой пользователь, который имеет повышенный набор разрешений.
  • Обслуживание. Было бы замечательно иметь возможность развертывать изменения в приложении, на котором выполняются фоновые процессы, не влияя на пользователя с помощью веб-сайта переднего конца.
  • Производительность. Наличие приложения, отделенного от обработки запросов основного сайта, означает, что фоновые потоки не будут уменьшать возможности IIS для обработки очереди входящих запросов. Кроме того, приложение, обрабатывающее фоновые задачи, может быть развернуто на отдельный сервер, если это необходимо.

Мне было бы очень интересно услышать ваши мысли об этом подходе и должен ли я придерживаться Windows Services. Я очень склонен попробовать этот новый подход.

4b9b3361

Ответ 1

Что это значит для тех из нас, которые использовали для записи Windows Services для поддержки наших веб-приложений?

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

Должна ли мы использовать эту модель?

Стандартный ответ разработки: Зависит;)

Каковы подводные камни?

Одна проблема, которую я вижу, - это зависимость IIS. Если вам нужна служба для запуска на компьютере пользователя, мне было бы неловко просить их установить IIS только для запуска моего сервиса. Здесь я думаю, что традиционная модель работает лучше.

Мониторинг и отслеживание являются основными проблемами, но, как вы также отмечаете, это разрешено AppFabric. Это даже лучше, чем то, что вы получаете от Window Service. Однако вы добавили еще одну зависимость, которая также потребует .NET 4.0 и относительно новой версии Windows. Я тоже могу ошибаться, но я понимаю, что AppFabric не поддерживается в производстве на клиентских ОС. Что может вызвать дополнительные головные боли.

Вы также потеряете функциональность паузы в модели непрерывного веб-сайта.

Наконец, IIS, убивающий неактивные приложения-пулы, не единственный способ, с помощью которого пул приложений может перерабатывать. Редактирование файла web.config вызывает его, например, что может быть не идеальной ситуацией.

наиболее полезным является простота развертывания.

Я также считаю, что разработка намного проще - в прошлом у меня было консольное приложение и служба Windows, поэтому я могу dev/test на своей машине с помощью консольного приложения, а затем сменить его на службу Windows, когда он погаснет. Теперь dev/test намного проще.

A должен читать для этого Смерть для Windows-сервисов... Long Live AppFabric!

Ответ 2

Каковы подводные камни?

Один, который я нашел, не выключил событие. У вас есть AppStart, когда начинается веб-сайт (а не global.asax, потому что это только HTTP), но у вас нет способа справиться с завершением работы, что может означать, что удаление становится проблемой.

Ответ 3

Я бы посоветовал придерживаться службы Windows. Проблема с вашим номером 2. Вы не сможете обновить служебную часть веб-сайта без перезапуска всего веб-сайта.