Przejdź do:
Czym jest Azure Durable Function?
Prawie zawsze nasz system nie jest po prostu zestawem funkcjonalności (FaaS – Function as a Service) czy modułów, ale zestawem funkcjonalności wzajemnie na siebie wpływających, zależnych od siebie, wchodzących ze sobą w interakcje. Właśnie dzięki Azure Durable Functions jesteśmy w stanie opanować ten proces. Azure Durable Function to orkiestrator sterujący całym procesem biznesowym, czyli naszym workflow. To rozszerzenie Azure Functions, które pozwala na optymalizację procesów w bezserwerowym środowisku.
Azure Durable Function składa się z 3 podstawowych typów bloków:
Client Function
Jest swego rodzaju „starterem”, który uruchamia pewien proces. Najczęściej jest wyzwalany przez http request, dodanie rekordu do bazy danych, upload pliku itd.
Orchestrator Function
Jest to proces sterujący naszym workflow. To tu decydujemy o kolejności kroków naszego procesu.
Activity Function
To konkretna funkcjonalność, np. pobranie rekordu z bazy danych, wysłanie maila, wystawienie faktury itd.
Azure Durable Function – jak to działa w praktyce?
Przyjmijmy na potrzeby przykładu, że prowadzimy sklep z odzieżą, w którym po zaksięgowaniu płatności chcemy przedstawić klientowi możliwe wersje kolorystyczne i po dokonaniu wyboru zamknąć zamówienie. Stan wyjściowy przedstawiałby się następująco:
Spróbujmy odpowiedzieć na następujące pytania:
- Na jakim etapie procesu akurat znajduje się klient?
- Jak możemy wychwycić ewentualne błędy?
- Czy w przypadku wystąpienia błędu możemy ponowić krok lub proces?
- Czy możemy zrównoleglić poszczególne kroki?
- W jaki sposób możemy otrzymać potwierdzenie wyboru przez klienta?
Jak widać, problemów jest wiele. Proces nie jest doskonały i nie da się go kontrolować w łatwy sposób. Zróbmy to, jak trzeba!
Zaczynamy od „startera”:
Stworzyliśmy funkcję, która jest wyzwalana przez http request i otrzymuje informacje o zamówieniu. Jej kluczowym elementem jest obiekt typu IDurableOrchestrationClient, który uruchamia wybrany proces.
Pora na użycie orkiestratora. W swojej początkowej, uproszczonej postaci może po prostu wyglądać tak:
Jak widać, jest to miejsce, z poziomu którego możemy kontrolować cały proces zamówienia.
Poszczególne kroki procesu, czyli tzw. Activity Function, w dużym uproszczeniu, nie zagłębiając się w szczegóły, mogą po prostu wyglądać tak:
Wprowadźmy modyfikacje, tak aby jasne stały się odpowiedzi na wcześniej zadane pytania:
Prześledźmy ważne zmiany:
- Dzięki zastosowaniu metody CallActivityWithRetryAsync jesteśmy w stanie powtórzyć krok w przypadku błędu.
- Dzięki użyciu wzorca Fan-out Fan-in umożliwiliśmy znacznie szybsze wygenerowanie wersji kolorystycznych poprzez zrównoleglenie przetwarzania.
- Jak widać, dzięki temu, że mamy orkiestrator, w łatwy sposób możemy użyć konstrukcji WhenAll dla osiągnięcia powyższego celu.
Dzięki użyciu wzorca Human Interaction udało nam się zasymulować oczekiwanie systemu na potwierdzenie przez użytkownika w zadanym czasie 24 godzin.
Pozostaje kwestia monitorowania stanu procesu. Domyślnie po uruchomieniu orkiestratora otrzymujemy zestaw odnośników do listy operacji na workflow:
Żeby sprawdzić bieżący status procesu, wystarczy wywołać statusQueryGetUri, w wyniku czego otrzymamy na przykład:
Widzimy zatem, że proces się zakończył i jest w stanie completed.
Azure Durable Function – zalety rozwiązania
- Jest oparte na Microsoft Azure – platformie, z której na co dzień korzysta setki tysięcy ludzi.
- Może pracować w trybie serverless, popularnie nazywanym pay-as-you-go – płacimy tylko za faktyczny czas korzystania z usługi.
- Może być dowolnie skalowane w zależności od obciążenia – nie musimy niczego implementować ani ustawiać. Funkcja wyskaluje się do tego stopnia, żeby maksymalnie przyśpieszyć wykonanie zadania.
- Każda funkcjonalność może być podzielona na osobne, niezależnie rozwijane moduły.
- Każda funkcjonalność (funkcja) może być napisana w innym języku, np. C#, Java, JavaScript, Python itd.
Azure Durable Function – podsumowanie
Podsumowując, dzięki użyciu Azure Durable Function jesteśmy w stanie dowolnie zaprojektować skomplikowany workflow, w pełni go kontrolując. Funkcje natywne mogą współpracować z całym ekosystemem chmurowym, więc możliwości rozbudowy procesu są w zasadzie nieskończone. Dodatkowo mamy możliwość konteneryzacji funkcji w środowisku on-premise – ale to już temat na osobny artykuł.
Przeczytaj także: Kim jest DevOps i jak wspiera projekty?