Myśli o uruchomieniu aplikacji typu Service Windows na ASP.NET 4 with StartMode= " AlwaysRunning"

Zwykle patrzyłbym na pisanie usługi Windows do zarządzania zadaniami, które nie nadają się do hostowania w aplikacji internetowej. Tego typu zadania są zwykle długotrwałymi procesami lub zaplanowanymi zadaniami. Chociaż jest to zwykle podstawowe podejście do tego typu zadań, Ludzie przyjrzeli się sposobom uruchamiania tego rodzaju procesów w tle w aplikacji internetowej, uruchamiając kilka wątków w zdarzeniu Application_Start wystawionym przez Global.asax. Problem z tym podejście zawsze polegało na tym, że jeśli twój proces roboczy usługi IIS umrze, Twój wątek w tle również zostanie zabity(skutecznie Twoja "usługa Windows" zostanie zatrzymana do czasu otrzymania następnego żądania).

ASP. net 4.0 oferuje rozwiązanie tego problemu. Możesz teraz ustawić StartMode na 'AlwaysRunning', jak opisano w tym blogu Scotta Gu. gdzieś w komentarzach do tego wpisu ktoś zadaje pytanie o opłacalność hostingu zadań typu usługi Windows w IIS od nowa funkcja zapewnia, że proces roboczy jest zawsze uruchomiony. Scott wspomniał, że to zdecydowanie wesprze scenariusz. Ponadto, niedawne wprowadzenie AppFabric oznacza, że Microsoft sam dostarcza proste Hooki do hostingu i monitorowania usług WCF i WF w aplikacji internetowej.

Co to oznacza dla tych z nas, którzy pisali usługi Windows do obsługi naszych aplikacji internetowych? Czy powinniśmy przyjąć ten model? Jakie są pułapki? Z tego co wiem, istnieje wiele zalet hostowania procesów "usługi Windows" w aplikacji internetowej, z których najbardziej przydatna jest łatwość wdrożenia. Ponadto możemy rozpocząć tworzenie prostych interfejsów użytkownika do naszych usług, które dostarczają informacji o tym, co dzieje się w czasie wykonywania.

Gdybym miał iść tą trasą, nie sądzę, żebym hostował funkcjonalność typu "usługa Windows" w aplikacji internetowej klienta. Prawdopodobnie stworzyłbym nowy projekt aplikacji webowej (dużo tak jak w kontekście usługi Windows), który będzie obsługiwał moje długie uruchomione / zaplanowane procesy zadań. Myślę, że jest ku temu kilka powodów.

  1. bezpieczeństwo. Może istnieć inny model zabezpieczeń dla interfejsu wyświetlającego informacje o uruchomionych procesach w tle. Nie chciałbym ujawniać tego interfejsu nikomu poza zespołem operacyjnym. Ponadto aplikacja internetowa może działać jako inny użytkownik, który ma podwyższony zestaw uprawnienia.
  2. utrzymanie . Byłoby wspaniale móc wdrożyć zmiany w aplikacji hostującej procesy w tle bez wpływu na korzystanie przez użytkownika z witryny front-end.
  3. wydajność . Oddzielenie aplikacji od strony głównej przetwarzającej żądania użytkowników oznacza, że wątki w tle nie zmniejszają możliwości obsługi kolejki przychodzących żądań przez IIS. Ponadto aplikacja przetwarzająca zadania w tle może być w razie potrzeby wdrożone na oddzielnym serwerze.

Byłbym bardzo zainteresowany, aby usłyszeć swoje przemyślenia na temat tego podejścia i czy powinienem trzymać się Usług Windows. Bardzo mnie kusi wypróbowanie tego nowego podejścia.

Author: Rohland, 2010-09-14

3 answers

Co to oznacza dla tych z nas, którzy pisali usługi Windows do obsługi naszych aplikacji internetowych?

Myślę, że to kluczowy scenariusz, w którym można odejść od usługi Windows do korzystania z ciągłej pracy strony internetowej.

Czy powinniśmy przyjąć ten model?

Standardowa odpowiedź rozwojowa: zależy;)

Jakie są pułapki?

Jedną z kwestii, którą widzę, jest zależność IIS. Jeśli potrzebujesz usługi do uruchomienia na użytkowniku maszyna nie czułbym się komfortowo prosząc ich o zainstalowanie IIS tylko po to, aby uruchomić moją usługę. Tutaj myślę, że tradycyjny model działa lepiej.

Monitorowanie i śledzenie to główne problemy, ale jak również podkreślasz, rozwiązuje to AppFabric. Jest to nawet lepsze niż to, co otrzymujesz z usługi okiennej. Jednak dodałeś kolejną zależność, która również będzie wymagała. NET 4.0 i stosunkowo nowej wersji systemu Windows. Tutaj też mogę się mylić, ale rozumiem, że AppFabric jest nie jest obsługiwane w produkcji na klienckim systemie operacyjnym, co może przynieść dodatkowe bóle głowy.

Stracisz również funkcjonalność pauzy w modelu ciągłej strony internetowej.

W końcu IIS zabija nieaktywne Pule aplikacji-nie jest to jedyny sposób, w jaki pula aplikacji może zostać poddana recyklingowi. Edytowanie strony www.plik konfiguracyjny powoduje to na przykład, co może nie być idealną sytuacją.

Najbardziej przydatna jest łatwość wdrożenia.

Myślę też, że rozwój jest znacznie łatwiejszy - w przeszłości miałem aplikacja konsolowa i usługa windows, dzięki czemu mogę tworzyć/testować na moim komputerze za pomocą aplikacji konsolowej, a następnie zmienić ją na usługę windows, gdy gaśnie. Teraz dev / test jest znacznie łatwiejszy.

A must read for this is Death to Windows Services...Niech Żyje AppFabric!

 5
Author: Robert MacLean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-15 14:53:23

Jakie są pułapki?

Jeden, który znalazłem, bez zdarzenia wyłączenia. Masz AppStart podczas uruchamiania Strony Internetowej (nie globalny.asax bo to tylko HTTP) ale nie masz jak obsłużyć shutdown co może oznaczać, że usuwanie staje się problemem.

 3
Author: Robert MacLean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-20 10:07:25

Proponuję pozostać przy usłudze windows. Problem jest z Twoim numerem 2. Nie będzie można zaktualizować części serwisowej witryny bez ponownego uruchomienia całej witryny.

 1
Author: Kirill Muzykov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-20 10:11:27