Func  Azurowe funkcje otwierają drogę do stylu programowania, który nazywa się serverless . Pozwala on na szybkie tworzenie, jak i rozbudowanie, zautomatyzowanie twoich usług sieciowych po najmniejszych kosztach. 

Microsoft zainwestował ostatnio dużo sumę pieniędzy na serwery Azure w Polsce. Oznacza to, że nauka tej technologii to na chwilę obecną najlepsza inwestycja pieniędzy, jak i czasu.

Zobaczmy jak można zacząć swoją przygodę z Azure Functions w wersji 3.

Azure Functions = Events + Code

Sercem funkcji azurowych jest idea obsługi zdarzeń i kodu. Dajesz trochę kodu do pojedynczej funkcji. Ten kod może być napisany w C#, JavaScript, Java i mówisz w ten sposób Ażurowej Funkcji, jakie zdarzenie powinno się wykonać. Oto przykłady:

Time Trigger

Możesz stworzyć funkcję, która będzie się uruchamiać co godzinę . Zdarzenie to więc wykona kod co godzinę. Być może taka funkcja przydałaby Ci się w nocnym przetwarzaniu i transformacji danych ("Batch") w bazie lub jej czyszczenia zbędnych rekordów.

Data Trigger

Kolejnym wyzwalaczem funkcji może być nowa "dana" pojawiająca się w kolejce lub tak zwanym magazynie danych: blob storage. Może to też być plik, który został przesłany do blob storage.  Być może chce skorzystać z tego zdarzenia i wysłać ten plik później przez e-mail.

Web Trigger

Co powiesz na funkcję, która się wykona w zależności od zapytania HTTP na dany adres. Być może chce przechwycić wywołanie zwrotne od serwisu płatniczego za każdym razem, gdy sprzedaje produkt online. Nie zapomnijmy też o prostszych rozwiązaniach, bo przecież przy pomocy tych funkcji mogę stworzyć API Restowe, które będzie mi zwracać dane w formacie JSON czy XML. 

Oczywiście teraz możesz zadać sobie bardzo ważne pytanie? Zaraz czy my przypadkiem już tego nie możemy robić bez żadnych funkcji w Azure.

W samej chmurze też masz Azure Web Apps i Web Jobs, które mogę spełnić te same funkcje. Pamiętajmy też o maszynach wirtualnych

Dlaczego funkcję są lepsze i dlaczego chciałbyś ich używać?

Azure Virtual Machines

W chmurze Azure może stworzyć maszynę wirtualną i zainstalować na niej cokolwiek chcesz. Możesz zainstalować serwer IIS i uruchomić na niej stronę internetową ASP.NET. 

W systemie operacyjnym Windows może chcesz tworzyć usługę Windows, która będzie robić zadania w tle jak przetwarzanie informacji w kolejkach czy wykonywanie zadań o określonych porach.

Te podejście nazywa się IaaS, czyli Infrastructure as a Service. Zaletą tego rozwiązania jest kompletna kontrola nad serwerem. Mogę zainstalować swój system operacyjny i mogę dostosować tę maszynę do swoich potrzeb. Mogę wybrać ile ramu i procesora ta maszyna będzie mieć.

Oczywiście z tymi zaletami pojawiają się też odpowiedzialności . Muszę pilnować tego, aby mój system operacyjny, jak i oprogramowanie na nim było aktualne i bezpieczne.

Jeśli chce skalować swój system to niestety muszę zrobić to sam tworząc kolejną maszynę wirtualną i skonfigurować je te maszyny mają  gadać między one między sobą.

W takich chwilach możesz stwierdzić, że może tę odpowiedzialność przekierować do dostawcy chmury Azure i nie martwić się swoimi wirtualnymi serwerami i systemami operacyjnymi.

Azure App Service

Kolejna opcja uruchomienia kodu w Azure polega na użyciu Azure App Service. Co to jest? Jest to rozwiązanie Platform as a Service (PaaS)

W tym modelu przeciwieństwie do maszyn wirtualnych to dostawca chmury bierze odpowiedzialność za system operacyjny, jak i sam serwer. Ty tylko dajesz kod do swoich zadań.

Te rozwiązanie powstało z myślą o szybki umieszczeniu swojej strony internetowej w dowolnej technologii jak np. Nodej.js. PHP, ASP.NET

Potem mówisz Azur by hostował twoją stronę internetową w konkretnym planie hostingowych.

W zależności od twojego wyboru będziesz mógł ograniczyć ilość zapytań do swojej strony/aplikacji internetowej lub włączyć automatycznie skalowanie byś nie był zaskoczony w godzinach szczytu gdzie 100 osób na raz przed zamknięciem sprzedaży chce kupić twoj produkt.

A czym są jeszcze te Web Job-y?

Jest to rozwiązanie do tworzenia twoich zadań w tle. Jak np. umieszczenie tej samej usługi (twojej aplikacji) w tym samym planie hostingowym . 

Zaleta tych rozwiązań jest skalowanie. To pozwoli Ci ograniczyć koszty związane z posiadaniem serwera. A gdy twoja strona stanie się bardziej popularna to w każdym momencie możesz powiększyć jej zasoby jeszcze bardziej.

Azure Functions

Zostały one wyłączone do platformy App Service w 2016 roku i obecnie w 2020 roku jest ona w wersji 3. Co możemy zrobić w funkcji Azure, a czego nie możemy zrobić w aplikacji webowej hostowanej w chmurze

Po pierwsze model programowania został uproszczony. Stworzenie funkcji jest bardzo proste i jednym kod, który napiszesz do niej będzie związany z działaniem samej funkcji

Kod związany przypinaniem zdarzenia jest odseparowany od ciebie i tym ty się nie musisz martwić. Daje to szybki styl tworzenia oprogramowania . W końcu skupiasz się tylko na tym co będziesz robił. Co więcej, nie będziesz powielał tego samego kodu deklaratywnego zdarzeń

Zaletą tego rozwiązania jest też płatność zależna od poziomu konsumpcji danej funkcji. Z Wirtualnymi maszynami, jak i aplikacjami internetowymi  musisz mieć przynajmniej jeden serwer i za to musisz zapłacić

Natomiast z funkcjami jest tak, że zapłacisz dokładnie tyle razy ile twoja usługa była użyta, gdyż kosztów serwa nie ma, a raczej, jeśli twoja usługa nic nie robi to ty nic nie płacisz.

Koszty

Są dwa style płatności :

  • za numer egzekucji,
  • czas wykonywania twojej funkcji z przeliczeniem pracy procesora plus ramu (oni to przeliczają na jednostkę Gigabajtów na sekundę ).

Dobra wiadomość jest taka, że w każdym miesiącu dostajesz 1.000.000 egzekucji kodu swojej funkcji lub tych 400,000 GB-s za darmo

Oznacza to, że funkcjami możesz dużo zrobić nie płacą za nic od razu.

Jak możesz uciąć koszty?

  • Twoja funkcja musi się wykonać najszybciej jak jest to możliwe.
  • Ograniczyć liczbę wywołań
  • Zredukować koszty pamięci

Plan konsumpcji twojej funkcji ograniczy i tak wywołanie jej do 5 minut. Oznacza to ,że nawet jeśli coś pójdzie nie tak i zrobi się pętla nieskończona lub deadlock, który nie możesz zakończyć działania funkcji to ty nie stracisz przy tym dużej sumy pieniędzy.

Możesz ustawić dzienny limit swojej funkcji. 

Cenny ciągle się zmieniają, ale tutaj możesz sprawdzić ile co kosztuje i co jest darmowe:

Opłaty Azure

https://azure.microsoft.com/en-ca/pricing/details/functions/

A tutaj masz stronę z płatnościami, jeżeli chodzi o Azure App Service:

https://azure.microsoft.com/en-us/pricing/details/app-service/windows/

Poza tym Azure funkcję są dostępne jako kontener w Docker.  Oznacza to ,że może uruchomić Ażurową funkcję na każdym komputerze, który wspiera Dockera. Czyli możesz uruchomić Ażurową funkcję w innej platformie chmurowej niż Azure

Jakie są zalety Azure Function

  • Szybkie tworzenie funkcji.
    • Możesz nawet tworzyć jedną wewnątrz portalu Azure
  • Eliminujesz dużo kodu deklaratywnego "czym to jest"
    • Piszesz tylko kod, który Ciebie interesuje
  • Funkcję wspierają :
    • Continuous Integration
    • Autoryzacje
    • Certyfikaty SSL
    • Twoje domeny
  • Płacisz tylko za to co używasz
  • Możliwość skalowania
  • Nie zawracasz sobie głowy serwerem
  • ...i są serverless
  • ...i dają możliwość rozbicia aplikacji na mniejsze cegiełki, czyli stworzenia mikroserwisów

Czekaj ja jeszcze tych ostatnich zalet nie omówiłem .

Co to jest serverless?

Azure functions działa na platformie Serverless. Oczywiście, jeśli wybrałeś taki model zapłaty. Pojęcie Serverless stał się bardzo popularny w ostatnich latach i wiele dostawców chmury oferuje podobne serverlessowe usługi jak np. Amazon AWS lambda

Okej najpierw po mówmy o słoniu w pokoju. Nazwa serverless jest trochę śmieszna i widać, że jest to buzzword, aby sprzedawać rozwiązanie technologiczne. Po pierwsze, mimo iż nazywam to serverless to wciąż są serwery, które uruchamiają twój kod

Pojęcie to bardziej określa delegacje zarządzania serwerami do osób trzecich. Tak, abyś ty jako programista skupił się na pisaniu kodu.

W architekturze serverless używasz rozwiązań PaaS jak najczęściej jest to możliwe. Czyli baza danych jest też chmurze ("Cosmos DB") . Usługa autoryzacji Auth0 też jest u dostawcy.

Wysłanie e-mail, logowanie, szukanie , usługi płatności to wszystko może być ogarnięte przez dostawce chmury

Ażurowym funkcjom mówisz, kiedy powinny być uruchamiane,a  to jak to jest zrobione nie leży już po twojej stronie.

Co więcej, ten styl projektowania funkcji Azure jest nazywany jako FaaS, czyli Functions as a Service,

Azurowe funkcję są więc serverless jednak warto sprostować jakie ograniczenia takiej architektury są . W końcu, jeśli będziesz chciał skorzystać ze swojej usługi dostawczej to pojęcie serverless jest już złamane.

Jak to może wyglądać w prawdziwym świecie, czyli rozbijanie aplikacji na Azure Function

Po jakiego grzyba w ogóle chciałbyś mieć azurowe funkcję?

Serwer Web

Jeśli masz prostą stronę internetową to odpowiedź brzmi oczywiście, że nie. Jeśli twój serwer tylko zwraca pliki (HTML, JS ,CSS) i przetwarza proste polecenia to funkcje nie będą Ci potrzebne.

Jednak prawdziwe życie potrafi zaskakiwać. Napisałem tego właśnie bloga w ASP.NET Core i kto wie, czy przyszłości mój serwer nie będzie musiał zarządzać newsletterami i płatnościami użytkowników za płatne kursy, szkolenia. Być może bym chciał otrzymać dzienny raport z działalności mojego bloga o 4:00 nad ranem.

Załóżmy, że tak by zrobił, a potem któregoś dnia stwierdził, że jednak chce mieć bloga na WordPressie i na PHP. Problem jednak polega na tym, że mam tak dużo kodu w C# w swojej aplikacji, która robi mnóstwo innych rzeczy, że taka migracja nie byłaby możliwa.

Mówimy tu o blogu, a teraz pomyśl  ile procesów może być na serwerze danej firmy

Na przykładzie firmy ubezpieczeniowej przychodzi mi na myśl taki obrazek.

Serwer Web na monolicie

Serwer musiałby pobierać notatki policyjne, a później w nocy je przetwarzać dla pracowników, którzy sprawdzają szkody samochodowe, jak i samo ubezpieczenie.

Na pewno przydałaby się kolejka do wysłania e-mail dla klientów firmy ubezpieczeniowej.

Byłaby też potrzebna kolejka do tworzenia dokumentów dla klientów firmy ubezpieczeniowej.

Dodatkowo chciałby mieć możliwość sprawdzenia przez aplikację mobilne  poprawność danych danego klienta, jak i samego agenta ubezpieczeniowego

Chciałby też przechwytywać polecenie opłaty za moje usługi mojej firmy.

Wiesz mi tego może być dużo, dużo więcej. Prosta aplikacja internetowa może urosnąć do dużych rozmiarów  z dużą ilością odpowiedzialności

Aplikacja na początku jest mała więc wydaje się sensowne by mieć tylko jeden serwer. Jednak później, jeśli nie pilnujesz rozbudowy swojej aplikacji to możesz skończyć z architekturą monolitu, którą prawie nie da się skalować

Jak Serverless mógłby nam w tym pomóc:

Możesz wszystko rozbić na pojedyncze funkcje Azure. Masz oddzielną funkcję do pobierania notatek policyjnych. Masz oddzielną funkcję do przetwarzania tych notatek na danym blob-ie. Serwis do opłat wysłał też swoją informację zwrotna do odpowiedniej innej funkcji. Masz oddzielną funkcję, która zajmuje się kolejką e-mail i tworzenia dokumentów.

Wracając do przykładu z blogiem mógłbym wydzielić funkcjonalność newslettera i opłat do funkcji. 

W ten sposób możemy rozbić monolit na zbiór luźno powiązanych funkcji. Możesz pomyśleć o tym rozwiązaniu jak o mikro serwisach następnego poziomu.

Z mikro serwisami mamy więcej wolności. Dodatkowo Azure pozwala nam grupować funkcję co pozwala im na wspóldzieleniu konfiguracji jak i lokalnych zasobów.

Podsumowanie:

W tym wpisie poruszyliśmy wiele informacji na temat Azure functions. W następnym wpisie stworzymy darmowe konto azure i stworzymy pierwsze funkcje Azure.