Azure Serverless workflow orchestration

Marcin Niesyn | Go to Cloud | 03.11.2021

Automatyzacja procesów biznesowych jest naturalną transformacją, z którą musi się zmierzyć większość przedsiębiorstw. Nie jest to łatwa droga, bo wymaga ogromnej wiedzy i doświadczenia, jednakże nie jesteśmy w tym starciu na straconej pozycji! W niniejszym artykule chciałbym przedstawić rozwiązanie oparte na Azure Durable Function, które pozwoli ci przejść gładko przez ten proces.

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:

Orchestrator Azure

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:

Azure workflow - proces zakupowy

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”:

Azure Functions

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:

Azure functions starter

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:

Azure functions proces

Wprowadźmy modyfikacje, tak aby jasne stały się odpowiedzi na wcześniej zadane pytania:

Azure order orchestrator
JPro 2021.11.03 graphic 7 - Azure Serverless workflow orchestration

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.
Fan-out / Fan-in
  • 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.

monitorowanie operacji workflow

Pozostaje kwestia monitorowania stanu procesu. Domyślnie po uruchomieniu orkiestratora otrzymujemy zestaw odnośników do listy operacji na workflow:

workflow orchestration Azure

Żeby sprawdzić bieżący status procesu, wystarczy wywołać statusQueryGetUri, w wyniku czego otrzymamy na przykład:

Azure workflow orchestrator

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: