{"id":30266,"date":"2021-11-03T13:55:01","date_gmt":"2021-11-03T12:55:01","guid":{"rendered":"https:\/\/nearshore-it.eu\/artykuly\/azure-serverless-workflow-orchestration\/"},"modified":"2024-09-17T15:23:01","modified_gmt":"2024-09-17T13:23:01","slug":"azure-serverless-workflow-orchestration","status":"publish","type":"post","link":"https:\/\/nearshore-it.eu\/pl\/artykuly\/azure-serverless-workflow-orchestration\/","title":{"rendered":"Azure Serverless workflow orchestration"},"content":{"rendered":"\n<div class=\"table-of-contents\">\n    <p class=\"title\">Przejd\u017a do:<\/p>\n    <ol>\n                    <li><a href=\"#Czym-jest-Azure-Durable-Function\">1.  Czym jest Azure Durable Function?<\/a><\/li>\n                    <li><a href=\"#Azure-Durable-Function-jak-to-dzia\u0142a-w-praktyce\">2.  Azure Durable Function \u2013 jak to dzia\u0142a w praktyce?<\/a><\/li>\n                    <li><a href=\"#Azure-Durable-Function-zalety-rozwiazania\">3.  Azure Durable Function \u2013 zalety rozwi\u0105zania<\/a><\/li>\n                    <li><a href=\"#Podsumowanie\">4.  Azure Durable Function \u2013 podsumowanie<\/a><\/li>\n            <\/ol>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"Czym-jest-Azure-Durable-Function\">Czym jest Azure Durable Function?<\/h2>\n\n\n\n<p>Prawie zawsze nasz system nie jest po prostu zestawem funkcjonalno\u015bci (FaaS \u2013 Function as a Service) czy modu\u0142\u00f3w, ale zestawem funkcjonalno\u015bci wzajemnie na siebie wp\u0142ywaj\u0105cych, zale\u017cnych od siebie, wchodz\u0105cych ze sob\u0105 w interakcje. W\u0142a\u015bnie dzi\u0119ki Azure Durable Functions jeste\u015bmy w stanie opanowa\u0107 ten proces. Azure Durable Function to orkiestrator steruj\u0105cy ca\u0142ym procesem biznesowym, czyli naszym workflow. To rozszerzenie Azure Functions, kt\u00f3re pozwala na optymalizacj\u0119 proces\u00f3w w bezserwerowym \u015brodowisku.<\/p>\n\n\n\n<p>Azure Durable Function sk\u0142ada si\u0119 z 3 podstawowych typ\u00f3w blok\u00f3w:<\/p>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.11.03_graphic_1.png\" alt=\"Orchestrator Azure\" class=\"wp-image-36036\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Client Function<\/h3>\n\n\n\n<p>Jest swego rodzaju \u201estarterem\u201d, kt\u00f3ry uruchamia pewien proces. Najcz\u0119\u015bciej jest wyzwalany przez <strong>http request,<\/strong> dodanie rekordu do bazy danych, upload pliku itd.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Orchestrator Function<\/h3>\n\n\n\n<p>Jest to proces steruj\u0105cy naszym workflow. To tu decydujemy o kolejno\u015bci krok\u00f3w naszego procesu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Activity Function<\/h3>\n\n\n\n<p>To konkretna funkcjonalno\u015b\u0107, np. pobranie rekordu z bazy danych, wys\u0142anie maila, wystawienie faktury itd.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Azure-Durable-Function-jak-to-dzia\u0142a-w-praktyce\">Azure Durable Function \u2013 jak to dzia\u0142a w praktyce?<\/h2>\n\n\n\n<p>Przyjmijmy na potrzeby przyk\u0142adu, \u017ce prowadzimy sklep z odzie\u017c\u0105, w kt\u00f3rym po zaksi\u0119gowaniu p\u0142atno\u015bci chcemy przedstawi\u0107 klientowi mo\u017cliwe wersje kolorystyczne i po dokonaniu wyboru zamkn\u0105\u0107 zam\u00f3wienie. Stan wyj\u015bciowy przedstawia\u0142by si\u0119 nast\u0119puj\u0105co:<\/p>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.11.03_graphic_2.png\" alt=\"Azure workflow - proces zakupowy\" class=\"wp-image-36037\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Spr\u00f3bujmy odpowiedzie\u0107 na nast\u0119puj\u0105ce pytania:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Na jakim etapie procesu akurat znajduje si\u0119 klient?<\/li>\n\n\n\n<li>Jak mo\u017cemy wychwyci\u0107 ewentualne b\u0142\u0119dy?<\/li>\n\n\n\n<li>Czy w przypadku wyst\u0105pienia b\u0142\u0119du mo\u017cemy ponowi\u0107 krok lub proces?<\/li>\n\n\n\n<li>Czy mo\u017cemy zr\u00f3wnolegli\u0107 poszczeg\u00f3lne kroki?<\/li>\n\n\n\n<li>W jaki spos\u00f3b mo\u017cemy otrzyma\u0107 potwierdzenie wyboru przez klienta?<\/li>\n<\/ul>\n\n\n\n<p>Jak wida\u0107, problem\u00f3w jest wiele. Proces nie jest doskona\u0142y i nie da si\u0119 go kontrolowa\u0107 w \u0142atwy spos\u00f3b. Zr\u00f3bmy to, jak trzeba!<\/p>\n\n\n\n<p>Zaczynamy od \u201estartera\u201d:<\/p>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.11.03_graphic_3.png\" alt=\"Azure Functions\" class=\"wp-image-36038\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Stworzyli\u015bmy funkcj\u0119, kt\u00f3ra jest wyzwalana przez <strong>http request<\/strong> i otrzymuje informacje o zam\u00f3wieniu. Jej kluczowym elementem jest obiekt typu <strong>IDurableOrchestrationClient<\/strong>, kt\u00f3ry uruchamia wybrany proces.<\/p>\n\n\n\n<p>Pora na u\u017cycie orkiestratora. W swojej pocz\u0105tkowej, uproszczonej postaci mo\u017ce po prostu wygl\u0105da\u0107 tak:<\/p>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.11.03_graphic_4.png\" alt=\"Azure functions starter\" class=\"wp-image-36039\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Jak wida\u0107, jest to miejsce, z poziomu kt\u00f3rego mo\u017cemy kontrolowa\u0107 ca\u0142y proces zam\u00f3wienia.<\/p>\n\n\n\n<p>Poszczeg\u00f3lne kroki procesu, czyli tzw. Activity Function, w du\u017cym uproszczeniu, nie zag\u0142\u0119biaj\u0105c si\u0119 w szczeg\u00f3\u0142y, mog\u0105 po prostu wygl\u0105da\u0107 tak:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.11.03_graphic_5.png\" alt=\"Azure functions proces\" class=\"wp-image-36040\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Wprowad\u017amy modyfikacje, tak aby jasne sta\u0142y si\u0119 odpowiedzi na wcze\u015bniej zadane pytania:<\/p>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.11.03_graphic_6.png\" alt=\"Azure order orchestrator\" class=\"wp-image-36026\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.11.03_graphic_7.png\" alt=\" class=\" class=\"wp-image-36027\" title=\"\"><\/figure>\n<\/div>\n\n\n<p>Prze\u015bled\u017amy wa\u017cne zmiany:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dzi\u0119ki zastosowaniu metody <strong>CallActivityWithRetryAsync<\/strong> jeste\u015bmy w stanie powt\u00f3rzy\u0107 krok w przypadku b\u0142\u0119du.<\/li>\n\n\n\n<li>Dzi\u0119ki u\u017cyciu wzorca <em>Fan-out Fan-in<\/em> umo\u017cliwili\u015bmy znacznie szybsze wygenerowanie wersji kolorystycznych poprzez zr\u00f3wnoleglenie przetwarzania.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.11.03_graphic_8.png\" alt=\"Fan-out \/ Fan-in \" class=\"wp-image-36028\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jak wida\u0107, dzi\u0119ki temu, \u017ce mamy orkiestrator, w \u0142atwy spos\u00f3b mo\u017cemy u\u017cy\u0107 konstrukcji <strong>WhenAll<\/strong> dla osi\u0105gni\u0119cia powy\u017cszego celu.<\/li>\n<\/ul>\n\n\n\n<p>Dzi\u0119ki u\u017cyciu wzorca <em>Human Interaction<\/em> uda\u0142o nam si\u0119 zasymulowa\u0107 oczekiwanie systemu na potwierdzenie przez u\u017cytkownika w zadanym czasie 24 godzin.<\/p>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.11.03_graphic_9.png\" alt=\"monitorowanie operacji workflow\" class=\"wp-image-36029\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Pozostaje kwestia monitorowania stanu procesu. Domy\u015blnie po uruchomieniu orkiestratora otrzymujemy zestaw odno\u015bnik\u00f3w do listy operacji na workflow:<\/p>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.11.03_graphic_10.png\" alt=\"workflow orchestration Azure\" class=\"wp-image-36030\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u017beby sprawdzi\u0107 bie\u017c\u0105cy status procesu, wystarczy wywo\u0142a\u0107 <strong>statusQueryGetUri<\/strong><em>,<\/em> w wyniku czego otrzymamy na przyk\u0142ad:<\/p>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/JPro_2021.11.03_graphic_11.png\" alt=\"Azure workflow orchestrator\" class=\"wp-image-36031\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Widzimy zatem, \u017ce proces si\u0119 zako\u0144czy\u0142 i jest w stanie <strong>completed.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Azure-Durable-Function-zalety-rozwiazania\">Azure Durable Function \u2013 zalety rozwi\u0105zania<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jest oparte na Microsoft Azure \u2013 platformie, z kt\u00f3rej na co dzie\u0144 korzysta setki tysi\u0119cy ludzi.<\/li>\n\n\n\n<li>Mo\u017ce pracowa\u0107 w trybie serverless, popularnie nazywanym <strong>pay-as-you-go<\/strong> \u2013 p\u0142acimy tylko za faktyczny czas korzystania z us\u0142ugi.<\/li>\n\n\n\n<li>Mo\u017ce by\u0107 dowolnie skalowane w zale\u017cno\u015bci od obci\u0105\u017cenia \u2013 nie musimy niczego implementowa\u0107 ani ustawia\u0107. Funkcja wyskaluje si\u0119 do tego stopnia, \u017ceby maksymalnie przy\u015bpieszy\u0107 wykonanie zadania.<\/li>\n\n\n\n<li>Ka\u017cda funkcjonalno\u015b\u0107 mo\u017ce by\u0107 podzielona na osobne, niezale\u017cnie rozwijane modu\u0142y.<\/li>\n\n\n\n<li>Ka\u017cda funkcjonalno\u015b\u0107 (funkcja) mo\u017ce by\u0107 napisana w innym j\u0119zyku, np. C#, Java, JavaScript, Python itd.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Podsumowanie\">Azure Durable Function \u2013 podsumowanie<\/h2>\n\n\n\n<p>Podsumowuj\u0105c, <strong>dzi\u0119ki u\u017cyciu Azure Durable Function jeste\u015bmy w stanie dowolnie zaprojektowa\u0107 skomplikowany workflow, w pe\u0142ni go kontroluj\u0105c.<\/strong> Funkcje natywne mog\u0105 wsp\u00f3\u0142pracowa\u0107 z ca\u0142ym ekosystemem chmurowym, wi\u0119c mo\u017cliwo\u015bci rozbudowy procesu s\u0105 w zasadzie niesko\u0144czone. Dodatkowo mamy mo\u017cliwo\u015b\u0107 konteneryzacji funkcji w \u015brodowisku on-premise \u2013 ale to ju\u017c temat na osobny artyku\u0142.<\/p>\n\n\n\n<p><strong>Przeczytaj tak\u017ce:<\/strong> <strong><a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/kim-jest-devops-i-jak-wspiera-projekty-it\/\">Kim jest DevOps i jak wspiera projekty?<\/a><\/strong><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Automatyzacja proces\u00f3w biznesowych jest naturaln\u0105 transformacj\u0105, z kt\u00f3r\u0105 musi si\u0119 zmierzy\u0107 wi\u0119kszo\u015b\u0107 przedsi\u0119biorstw. Nie jest to \u0142atwa droga, bo wymaga ogromnej wiedzy i do\u015bwiadczenia, jednak\u017ce nie jeste\u015bmy w tym starciu na straconej pozycji! W niniejszym artykule chcia\u0142bym przedstawi\u0107 rozwi\u0105zanie oparte na Azure Durable Function, kt\u00f3re pozwoli ci przej\u015b\u0107 g\u0142adko przez ten proces.<\/p>\n","protected":false},"author":29,"featured_media":30301,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"iawp_total_views":50,"footnotes":""},"categories":[1,582],"tags":[576],"offering":[516],"class_list":["post-30266","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykuly","category-technologie","tag-cloud-engineering","offering-cloud-engineering"],"acf":[],"_links":{"self":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/30266","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/comments?post=30266"}],"version-history":[{"count":2,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/30266\/revisions"}],"predecessor-version":[{"id":32448,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/30266\/revisions\/32448"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media\/30301"}],"wp:attachment":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media?parent=30266"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/categories?post=30266"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/tags?post=30266"},{"taxonomy":"offering","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/offering?post=30266"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}