WebJobs – przetwarzanie danych w tle

Wykonywanie zadań o wysokim stopniu złożoności pociąga za sobą wykorzystanie znacznej części procesora, jak i reszty zasobów komputera. Operacje tego typu potrafią być czasochłonne. Nie rzadko dochodzi do sytuacji, gdy wydajność systemu ulega znacznemu pogorszeniu, zwłaszcza podczas realizacji jakichś długotrwałych kalkulacji. Aby zapewnić wydajny i ciągły dostęp do aplikacji coraz częściej decydujemy się na zrzucanie tego typu zadań na dodatkowe procesy, tzw. workery, pracujące gdzieś w tle aplikacji. Dzięki temu są one tak niewidoczne dla użytkownika końcowego. Na potrzeby modelu PaaS Microsoft wprowadził do aplikacji hostowanych w chmurze mechanizm o nazwie WebJobs, odpowiadający za przetwarzanie dodatkowych zadań w tle.

WebJobs

WebJoby dostępne są w ramach każdego App Service Planu, ramach aplikacji wszelkiego typu aplikacji, webowych,  API apps czy mobile. W przypadku modelu PaaS nie mamy dostępu do samego systemu operacyjnego, gdzie można by tworzyć kolejne procesy, realizujące oddelegowane zadania, w sposób ręczny.

Jednym z najpopularniejszych zastosowań WebJobów jest image processing. Załóżmy, że użytkownik wrzucił jakieś zdjęcia do chmury, z których generowane są np. miniaturki. Proces ten nie musi być widoczny dla samego użytkownika, może być wykonywany gdzieś w tle, do tego już na samym etapie wgrywania zdjęć. Innym przykładem może być wykonywanie wszelkiego rodzaju kalkulacji, przetworzeń czy generowania raportów. Z mniej konsumujących zadań, WebJoby mogą zostać wykorzystane jako narzędzie do wykonywania backupów, przenoszenia lub parsowania plików np. z logami. Dostęp do systemu plików – zwłaszcza gdy mamy do czynienia z modelem PaaS, może być dla developerów mocno ograniczony. WebJob mógłby pobierać logi z maszyny wirtualnej aplikacji, a następnie przesyłać je na jakiś serwer FTP, skąd będą dostępne dla każdego członka zespołu. Warto zauważyć, że aplikacja współdzieli swoje zasoby z wszystkimi dostępnymi WebJobami. Polecam zapoznać się z otwartym Azure WebJobs SDK dostępnym na githubie.

Jakiego typu WebJob’y mamy do dyspozycji

W ramach chmury Azure możliwe jest stworzenie następujących rodzajów WebJobów:

  • na żądanie (on demand, triggered) – uruchamiane w danym momencie – np. z poziomu portalu, programistycznie, za pomocą skryptu PowerShellowego lub uderzając do wybranego endpoint’u REST’owego. Mogą być również uruchamiane, po wystąpieniu jakiegoś zdarzenia, np. pojawienia się wiadomości na kolejce queue storage, nowego pliku w blob storage lub za pomocą web hook’ów,
  • ciągłe (continuously) – pracujące przez cały czas, w nieskończonej pętli, od momentu uruchomienia, aż do manualnego zatrzymania,
  • planowane (scheduled) – działające według ustalonego wcześniej harmonogramu. WebJob może być uruchamiany raz dziennie o godzinie 23:00, albo co 15 minut od godziny 10:00 do 16:00. Tego typu zadania wykorzystują dodatkowy, niestety płatny, komponent jakim jest Azure Scheduler, aczkolwiek nic nie stoi na przeszkodzie, aby zrealizować takie rozwiązanie samemu. Koszty Azure Scheduler’a uzależnione są od częstości uruchamiania zaplanowanego job’a. Szczegółowy cennik znajdziesz pod następującym adresem.

Warto zaznaczyć, że nie jesteśmy ograniczeni tylko i wyłącznie do języka C#. Wspierane na dzień dzisiejszy rodzaje plików to:

  • pliki uruchomieniowe z poziomu konsoli Windows – *.bat, *.cmd, *.exe,
  • skrypty bashowe – *.sh,
  • skrypty PowerShellowe – *.ps1,
  • archiwum języka Java (Java archive) – *.jar,
  • pliki z kodem napisanym w różnych językach programowania, takich jak np. PHP, Python czy JavaScript – *.php, *.py, *.js.

Jak wdrożyć WebJob w chmurę

Przejdę po kolei przez najbardziej popularne metody deploymentu:

Portal Azure’owy (ARM)

WebJoby mogą być tylko i wyłącznie zuploadowane w formacie *.zip – związane to jest to z kwestiami bezpieczeństwa po stronie Azure’a. Firewall nie jest w stanie przepuścić np. plików wykonywalnych *.exe czy *.sh. W celu dodania nowego WebJoba wewnątrz portalu wybieramy aplikację webową, a następnie zakładkę Zadania WebJob (WebJobs). Teraz klikamy na przycisk Dodaj (Add). Po chwili powinna załadować się mała formatka w której należy uzupełnić: nazwę job’a, wgrać plik *.zip oraz wybrać pomiędzy WebJob’em ciągłym, a wyzwolonym (planowane WebJoby nie są wspierane przez portal ARM). Możesz tutaj również skonfigurować liczbę instancji danego job’a. Co do limitów: 50 WebJob’ów na aplikację, maksymalny rozmiar job’a – 100MB.

Visual Studio

Stwórz nowy projekt konsolowy lub wybierz szablon Azure WebJob. Następnie po zaimplementowaniu logiki, realizowanej w ramach job’a, kliknij prawym przyciskiem myszy na nazwę projektu w oknie eksploratora rozwiązań i wybierz opublikuj jako WebJob (Publish as Azure WebJob):

Deployment WebJob'a za pomocą Visual Studio.
Deployment WebJob’a za pomocą Visual Studio.

Następnie podaj nazwę oraz tryb pracy job’a i na końcu wybierz aplikację wraz z jej deployment slot’em.

PowerShell

Wsparcie WebJob’ów dla PowerShell’a niestety jest kiepskie. Na dzień dzisiejszy można tworzyć tylko joby ciągłe oraz na żądanie. Krótki skrypt przedstawiający podstawowe operacje (ASM):

Niestety nie znalazłem wsparcia dla nowszej wersji AzureRM ani dla AzureCLI.

Kudu

Na koniec wspomnę jeszcze o możliwości zarządzania jobami za pośrednictwem Kudu. Po zalogowaniu się do portalu przejdź do folderu D:\home\site\wwwroot. Wewnątrz niego – jeśli tylko masz jakieś WebJob’y – powinien znajdować się katalog App_Data. Znajdziesz w nim kolejne foldery odpowiadające typom stworzonych jobów (continuous oraz triggered). Wewnątrz nich znajdują się już katalogi odpowiadające samym WebJob’om.

W zakładce Tools > WebJobs dashboard znajdziesz listę wszystkich aktualnie znajdujących się wewnątrz aplikacji WebJob’ów – wraz z statusem w jakim się znajdują. Klikając w każdy z nich będziesz w stanie podejrzeć wszystkie logi jakie zostały wyrzucone na konsolę – jest to bardzo przydatne kiedy debugowanie na środowisku produkcyjnych staje się koniecznością – a niestety tak się zdarza:

Strona WebJobs Dashboard obrazująca wszystkie logi dla job'a.
Strona WebJobs Dashboard obrazująca wszystkie logi dla job’a.

Zachęcam również do przejrzenia zakładki Process Explorer, gdzie możesz śledzić listę wszystkich aktualnie działających procesów z uwzględnieniem WebJob’ów. Z poziomu tego menu jesteś w stanie zdezaktywować wybrane procesy, masz możliwość pobrania zrzutu pamięci dla każdego joba czy choćby profilowania każdego z interesujących Cię procesów:

Process Explorer ułatwiający zarządzanie wszystkimi procesami działającymi wewnątrz aplikacji.
Process Explorer ułatwiający zarządzanie wszystkimi procesami działającymi wewnątrz aplikacji.