De tempos em tempos, uma novidade tecnológica nos autoriza a pensar novas maneiras de desenvolver aplicações. Para desenvolvedores Microsoft, uma dessas tecnologias, sem dúvidas, é Azure Functions.
“Azure Functions” permite que executemos código em um ambiente Serverless, sem a necessidade de manter, explicitamente, uma máquina virtual ou publicar uma web application.
Nessa série, iremos detalhar “Azure Functions”, indicando cenários e alternativas onde a tecnologia se aplica, enumerando vantagens e desvantagens em cada caso, bem como práticas e padrões. Nesse primeiro post, introduziremos conceitos e ideias fundamentais.
O que é “Azure Functions”?
Azure Functions é uma tecnologia que permite a escrita de códigos para que sejam executados na ocorrência de uma determinada categoria de eventos. O código pode ser escrito em C#, F#, Java, Javascript ou Python (a microsoft mantem uma página com a lista atualizada de linguagens suportadas). Os eventos podem incluir requisições HTTP, modificiações em Blob Storage, recebimento de uma notificação em um sistema de mensageria, etc.
Com Azure Functions, cabe aos desenvolvedores “apenas” escrever o código que irá “responder” a um evento. Os eventos são monitorados pela infraestrutura do Azure que executa o código certo sempre que um evento de interesse ocorrer.
Por que usar Azure Functions?
Há pelo menos três razões que tornam o desenvolvimento de Azure Functions interessante:
- Simplificação do desenvolvimento: Com Azure Functions, o desenvolvedor precisa se concentrar especificamente no código que contem a lógica de negócio, usando as linguagens de programação que já conhece. Não será necessário desenvolver código para “escutar requisições http”, nem monitorar uma Queue para identificar o recebimento de uma mensagem. De forma abstrata e não muito precisa, apenas como exemplo, é como se o desenvolvedor escrevesse uma aplicação ASP.net, apenas com as “actions” dos controllers.
- Elasticidade natural: Cabe ao Azure, “ligar e desligar” instâncias de Azure Functions, automaticamente, conforme parâmetros especificados, para tratar o volume de demandas.
- Potencial redução de custos de nuvem: Há diferentes modelos de pricing oferecidos pela Microsoft e eles evoluem, naturalmente, com o tempo. Mas, há pelo menos um modelo onde são necessários um número considerável de “execuções” para que algum custo seja gerado.
Azure Functions é uma das ofertas da Microsoft para viabilizar a implementação de Serverless Architectures.
Serverless Architectures
A ideia central de arquiteturas Serverless é abstrair a existência e a gestão dos servidores dos processos de desenvolvimento e operação de aplicações. Isso ocorre pela utilização de componentes de backend de terceiros, fornecidos como serviço (Backend as a Service – BaaS), e de código backend desenvolvido especificamente para tratar eventos, distribuídos em conteineres efêmeros (Functions as a Service – FaaS), como Azure Functions.
Obviamente, o código do backend continuará executando em servidores (o que torna o termo Serverless confuso). Entretanto, a manutenção desses servidores fica a cargo de um provedor de serviços, geralmente de nuvem, como a Microsoft.
O trade-off em arquiteturas Serverless está no fato de que, por um lado, há significativa redução de custos e complexidades operacionais e prazos de desenvolvimento, de outro, há um aumento considerável de dependência (lock-in) a um determinado fornecedor.
Pontos de Atenção
Podemos utilizar Azure Functions para tratar, pontualmente, de necessidades de nossas aplicações, como, por exemplo:
- executar tarefas administrativas em horários ou intervalos de tempo especificados;
- disparar o envio de e-mails, na ocorrência de uma categoria de eventos de negócio, em um mecanismo simples de monitoramento;
- sincronizar bases de dados distintas
- etc.
As possibilidades são ilimitadas e as barreiras de entrada são baixas! Isso é ótimo… e é um problema. Em domínios complexos, o uso indiscriminado de “soluções criativas” desenvolvidas com Azure Functions pode fazer com que percamos o controle do “flow” de execução e deixemos de saber, exatamente, o que irá ocorrer no backend.
Em casos extremos, podemos “reimaginar” aplicações inteiras para que sejam desenvolvidas, apenas, com Azure Functions e BaaS. Entretanto, é importante que tenhamos em conta que se trata de um modelo diferente de arquitetura, com padrões e práticas novas e específicas, que ainda não estão suficientemente experimentadas e maduras.
Azure Functions é uma alternativa viável para o desenvolvimento de microsserviços da forma certa. Entretanto, todas as dificuldades associadas a microsserviços continuam presentes. Ainda é necessário adotar boas práticas para “fracionar” o domínio em microsserviços que sejam realmente desacoplados.
Azure Functions tem vários modelos de pricing. Em nossa opinião, os melhores modelos são aqueles em que pagamos conforme o uso, pagando nada quando não há uso. Entretanto, esses modelos nem sempre agradam organizações que querem ter controle sobre o valor que será gasto em cada período com a nuvem.
Completamos o primeiro passo
Nesse post, apresentamos conceitos fundamentais para Azure Functions e Serverless Architectures. Nos próximos posts, vamos “dissecar a anatomia de uma Azure Function” e demonstrar o porquê são tão atraentes. Também iremos começar a delinear práticas e padrões para adoção efetiva dessa tecnologia, maximizando resultados tecnológicos e para o negócio.
Com a adoção de u.a arquitetura hexagonal, o lock-in passa a ser um problema bem menos complexo em caso de migração.