Workflows + Orquestração de Tarefas em .NET com Azure Durable Functions

Renato Groffe
5 min readFeb 15, 2021

--

Transformar processos de negócio em código certamente resultará na implementação de diversas tarefas, bem como na definição do sequenciamento destas e até mesmo a execução paralela de tais atividades em alguns casos. Há inclusive design patterns que podem ser considerados nesta empreitada, como Chaining e Fan-Out/Fan-In.

Dentro da plataforma .NET e caso trabalhemos com a nuvem Microsoft temos a possibilidade de simplificar implementações deste tipo e que envolvam processos/workflows, valendo-se para isto do suporte oferecido pelas Azure Durable Functions. Esta alternativa baseada em Azure Functions conta com todo um mecanismo para simplificar a orquestração de tarefas, incluindo o suporte à programação assíncrona e ao processamento paralelo de atividades.

O próprio termo Durable no nome desta tecnologia não foi uma escolha em vão. As Azure Durable Functions permitem o armazenamento de estados durante a execução das atividades/funções que compõem o fluxo de um processo de negócio. Tais estados decorrentes do processamento de uma Function determinarão, por sua vez, o comportamento de atividades subsequentes.

Abordei com meus amigos Ewerton Rodrigues Jordão e Robson Rocha de Araújo o uso de Azure Durable Functions em uma apresentação no final do ano passado, durante MVPConf Latam 2020. Para ter acesso aos materiais desta palestra clique neste link.

Participamos também recentemente de uma live no Canal .NET, em que foram demonstradas implementações combinando a utilização desta tecnologia com .NET, PowerShell e Python. A gravação desta apresentação já está disponível para ser assistida no YouTube:

Neste post trago os exemplos que empreguei no evento online do Canal .NET (parte da edição 2021 do Azure Tech Nights), comentando também detalhes e os patterns empregados em cada implementação. Maiores informações sobre o uso de Azure Durable Functions estão no vídeo acima.

E aproveito este espaço para um convite…

Que tal participar do treinamento online pioneiro no Brasil sobre GitHub Actions e promovido pelo Azure na Prática, agora com diversas aulas já gravadas?

Acompanhe com comodidade e a qualquer tempo os diversos módulos deste treinamento, em que serão cobertas boas práticas + estratégias de build/deployment e o uso desta solução de automação com tecnologias como o próprio Azure Functions, Selenium WebDriver, Docker, Kubernetes, Azure App Service e outros serviços da nuvem Microsoft!

Acesse então o link a seguir para efetuar sua inscrição com um desconto especial de R$ 100,00 (inclui certificado e grupo para resolução de dúvidas durante e após o curso):

https://bit.ly/anp-githubactions-desc-100-blog-groffe

Criando um novo projeto para orquestração

O procedimento para criação de um projeto para se trabalhar com Azure Durable Functions em nada difere daquele adotado com outros tipos de implementação baseados em Azure Functions. Caso se opte pela utilização do Visual Studio Code será necessária a instalação das Azure Functions Core Tools, bem como da extensão que dá suporte ao uso de Azure Functions neste editor de código.

Durante a criação do projeto selecionar a alternativa DurableFunctionsOrchestration:

Concluída a geração das estruturas de um novo projeto teremos um arquivo .cs com um código similar ao da listagem a seguir:

Em que:

  • A Function TesteOrquestracao_HttpStart corresponde ao método que iniciará a execução de um workflow. Deve-se destacar aqui a presença do trigger que dispara o processamento (um HttpTrigger neste caso, mas poderíamos utilizar outros gatilhos como TimerTrigger ou QueueTrigger) e o objeto starter (uma instância de IDurableOrchestrationClient e marcada com o atributo IDurableOrchestrationClient) que permitirá iniciar a execuçao da Function de orquestração (TesteOrquestracao, acionada via método StartNewAsync);
  • A Function TesteOrquestracao responsável pela orquestração das chamadas à Function TesteOrquestracao_Hello. Neste exemplo temos o uso do objeto context (instância de IDurableOrchestrationContext marcada com o atributo OrchestrationTrigger), além de acionamentos da Function por meio de chamadas ao método CallActivityAsync de context;
  • A Function TesteOrquestracao_Hello, em que se nota a presença do atributo ActivityTrigger. As 3 chamadas a esta função aconteceram em TesteOrquestracao na sequência, o que se caracteriza num exemplo de uso do padrão Chaining.

Uma extensão interessante para Visual que nos ajuda a entender o fluxo neste projeto é a Durable Functions Monitor, apresentada pelo Robson Rocha de Araújo durante a live no Canal .NET:

Podemos inclusive obter um diagrama de sequência, mostrando o fluxo com as chamadas a TesteOrquestracao_Hello:

Mais um exemplo demonstrando Chaining

Durante a live no Canal .NET apresentei um exemplo de uso do padrão Chaining num projeto que acessava a API REST de imagens diárias da NASA (Function ObterDadosImagemPorData), o qual prosseguia com o upload no Azure Storage da foto correspondente a uma data informada via HttpTrigger (Function UploadImagemToStorage). A aplicação foi disponibilizada no seguinte repositório do GitHub:

.NET Core + Azure Functions 3.x + Durable Functions (Chaining) + Refit + Azure Storage + MongoDB + Imagens API REST NASA

Uma análise do fluxo de execução via extensão Durable Functions Monitor trará como resultado:

Um exemplo com Fan-Out/Fan-In

O próximo repositório é uma variação do exemplo anterior, desta vez recorrendo à execução simultânea de atividades/Functions através do uso do pattern Fan-Out/Fan-In:

.NET Core + Azure Functions 3.x + Durable Functions (Fan-Out/Fan-In) + Queue Starter + Refit + HttpClient (integrando com uma Logic App) + Azure Storage + MongoDB + Imagens API REST NASA

Para disparar a execução do workflow desta aplicação faremos uso de uma fila do Azure Queue Storage, com a execução das Functions:

  • ObterDadosImagemPorData, que obterá dados da imagem a partir da API da NASA;
  • UploadImagemToStorage acionada 2 vezes (para upload de uma imagem normal e sua versão em alta resolução no Azure Storage), simultaneamente a NotificacaoImagemSlack (que enviará um aviso a um canal do Slack).

Analisando a execução a partir da extensão Durable Functions Monitor teremos como resultado ao selecionar o diagrama de Gantt:

--

--

Renato Groffe
Renato Groffe

Written by Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker

No responses yet