Azure Functions — Um panorama geral
Olá pessoal, tudo bem com vocês?
No post de hoje vamos conhecer um pouco mais sobre o Azure Functions, a poderosa plataforma serverless da Microsoft que tem ganhado cada vez mais mercado e vem ajudando empresas a acelerar seus produtos.
O que é serverless?
O serverless é um tipo de abordagem no qual o desenvolvedor se preocupa apenas com o código, ou seja, não é necessário provisionar, gerenciar ou até mesmo escalar os servidores em que os aplicativos serão executados, ficando a cargo dos provedores de nuvens (Microsoft, Google e Amazon).
Caso queira saber um pouco mais sobre serverless, escrevi esse post um pouco mais detalhado sobre o tema.
O que é Azure Functions?
Para entendermos melhor, vamos pegar uma definição fornecida pela própria Microsoft.
O Azure Functions é um serviço de nuvem disponível sob demanda que fornece toda a infraestrutura e os recursos continuamente atualizados necessários para executar os aplicativos. Você se concentra nas partes do código mais importantes e o Functions cuida do restante.
Um característica muito interessante sobre o Azure Functions é que será cobrado apenas pelo recurso computacional utilizado, ou seja, apenas será cobrado os momentos em que a função estiver sendo executada, enquanto isso, nos momentos ociosos, nenhuma cobrança será realizada.
É interessante pontuar que essa cobrança por demanda está atrelada ao tipo de plano definido para o Azure Functions e que dependendo do plano, isso não estará disponível como veremos um pouco a frente.
Casos de Uso da Azure Functions?
O Azure Functions é uma excelente escolha quando precisamos desenvolver microserviços ou nanoserviços no qual serão responsáveis por receber algum tipo de dado, seja por mensageria, HTTP ou algum outro meio e que necessite a aplicação de alguma regra de negócio para posteriomente salvar essa informação em algum banco de dados ou até mesmo devolver uma mensagem como resposta em alguma outra fila ou tópico.
Um outro contexto muito interessante onde o Azure Functions é uma escolha certeira é em relação a serviços agendados, onde podemos desenvolver uma função que será executada de tempos em tempos baseado em algum critério. Dando alguns pequenos exemplos, podemos agendar uma função para rodar a cada 1 hora; podemos agendar para sempre rodar ao final de cada dia, para fazer alguma tarefa especifíca como, por exemplo, a criação de um relatório com muitas informações de múltiplas fontes; e um último exemplo seria agendar uma função para ser executada uma vez na semana ou ainda uma vez ao ano para casos como relatórios de imposto de renda.
Um último contexto em que gostaria de abordar seria a utilização do Azure Functions para respostas a uploads de arquivos ou imagens feitos no Azure Blob Storage, ou seja, suponhamos que a cada upload de imagem feito no Azure Blob Storage, é necessário a criação de um thumbnail (versão miniatura da imagem original) daquela imagem. Nesse caso, usariamos a implementação de uma trigger que possui a capacidade de ficar escutando tudo o que acontece no Azure Blob Storage e que a cada upload de imagem, a função seria acionada, a imagem seria recebida e processada criando assim um thumbnail que seria salvo no mesmo Blob Storage ou até mesmo em algum outro.
Aqui abordamos alguns contextos de uso do Azure Functions, porém existem muitas outras possibilidades de utilização do mesmo.
Triggers e Bindings no Azure Functions
Triggers são recursos do próprio Azure Functions responsáveis por iniciar a execução de funções e cada função pode apenas possuir uma trigger específica.
Bindings são recursos que possibilitam a conexão com serviços externos de forma transparente e sem complexidade. Existem dois tipos de bindings, os de entrada (bindings input) que são responsáveis por receber alguma informação e os bindings de saída (bindings output) que são responsáveis por enviar alguma informação para algum outro serviço.
Vamos analisar o exemplo abaixo
Nessa função é demonstrado a implementação de uma trigger (BlobTrigger), responsável por se conectar e ficar escutando tudo o que acontece no Azure Blob Storage, onde sempre que um novo upload é realizado, a trigger aciona a função para iniciar a execução
Quando a função é invocada, recebemos as informações da imagem através da variável “inputBlob” que é um Stream, com isso realizamos o processamento dessa imagem diminuindo o seu tamanho e posteriormente enviamos para outro Azure Blob Storage, definido no segundo parâmetro.
Podemos dizer que a trigger é o binding de entrada de dados e o o binding de saída é o segundo parâmetro da função que é responsável por se conectar a outro Blob Storage e enviar a imagem.
Bem simples, não acha? Pois bem, essa é a facilidade que o Azure Functions proporciona.
E para exemplificar melhor todas as triggers e bindings disponíveis atualmente, segue uma pequena imagem retirada da documentação oficial do Azure Functions:
Planos de execução
Para a utilização do Azure Functions, antes de tudo é necessário definir o plano que melhor atende o seu contexto de negócio e para isso temos alguns planos disponíveis, porém vamos explicar apenas os 3 principais.
Consumption Plan — Plano padrão de hospedagem. Todo o dimensionamento dele é feito automaticamente e você apenas paga pelos recursos computacionais quando suas função estão em execução. As instâncias são adicionadas e removidas dinamicamente baseado na quantidade de eventos de entrada.
Premium Plan — Escala automaticamente com base na demanda usando trabalhadores pré-aquecidos, que executam aplicativos sem atraso após ficarem inativos, são executados em instâncias mais poderosas e se conectam a redes virtuais.
Dedicated Plan — As funções são executadas utilizando o Azure App Service com as taxas definidas no Azure App Service Plan com isso você paga 24 horas por dia sua função, mesmo nos momentos de inatividade da função. Melhor para cenários de processamento de longa duração.
Tempo de execução / Timeout do Azure Functions
O Azure Functions possui um tempo de execução (timeout) padrão para cada tipo de plano oferecido. Uma vez atingido o tempo máximo de execução da função, ela será suspensa automaticamente, mesmo estando em processamento, por isso é importante definir uma boa estratégia no uso das funções.
Na imagem abaixo retirada da documentação oficial, podemos ver o tempo mínimo e máximo de execução para cada tipo de plano.
Azure Functions Runtime
O Azure Function possui diferentes versões para sua execução. Abaixo temos uma imagem retirada da documentação oficial que explica todas as versões disponíveis e versões das linguagens suportadas.
Afinal, como é o funcionamento interno de uma Azure Functions?
Sempre que alguma função é implantada no Azure Functions, todos os arquivos dessa função ficam armazenados em um Azure Storage, portanto sempre que o Azure Functions precisar executar uma função, é necessário obter todos os arquivos no Azure Storage, caregar em memória e executar.
Abaixo temos uma imagem explicando passo a passo como o Azure Functions funciona.
Para funções que utilizam o Consumption Plan e inativas por mais de 20 minutos, o Azure automaticamente faz a desalocação de todo o recurso utilizado.
Cold Start / Always On
O Cold Start é um termo muito utilizando para descrever quando uma função em estado inativo é invocada, sendo necessário a alocação de recursos para sua execução, obtenção do código fonte da função e finalmente a execução em si, elevando a latência nas primeiras chamadas a função.
Vale lembrar que todo esse processo do Cold Start é totalmente gerenciado pelo Azure Functions.
Always On é basicamente o oposto do Cold Start e quando habilitado, a função não ficará inativa e nenhum recurso será desalocado, ou seja, em casos de longo período de inatividade por parte da função, quando é solicitado um novo processamento, este começa imediatamente, eliminando completamente o tempo de latência.
Na imagem abaixo podemos ver como o processo de Cold Start e Always On acontece.
O Cold Start é uma característica apenas de função que estão utilizando o Consumption Plan e o Azure utiliza essa abordagem por ser um plano totalmente gerenciado e para otimização de recursos.
O Always On é uma característica de funções que estão utilizando o Dedicated Plan, no qual seus recursos estão atrelados a um App Service Plan.
O Premium Plan tem um característica interessante no qual é possível definir a quantidade de instâncias mínima que ficarão pré aquecidas, ou seja parte do recurso da sua função já estará alocado, porém um tempo mínimo de latência ainda pode ser percebido nas primeiras execuções, porém bem menor que no caso do Cold Start.
Limites de Escalabilidade
O Azure Functions apesar de apresentar uma flexibilidade muito grande em relação a escalabilidade, possui uma limitação de instâncias para cada plano.
Linguagens suportadas
O Azure Functions é suportado pelas linguagens C#, F#, Javascript, Java, Powershell, Python e Typescript.
Show me the code
Nesse post abordamos pontos importantissímos do funcionamento de uma Azure Functions e falamos de alguns cenários de uso, porém para reforçar o aprendizado, recomendo assistir o workshop que eu fiz em conjunto com a Ana Carolina Manzan para o canal do DevelopersBR no YouTube onde explicamos na prática o funcionamento do Azure Functions, utilizando alguns cases reais de implementação.
Workshop
[Online|Abril PRO Azure] Serverless no Azure — YouTube
Repositório de exemplos de implementação do Azure Functions
[Online|Abril PRO Azure] Serverless no Azure — DevelopersBR (github.com)
Conclusão
Nesse post entendemos mais detalhadamente de como é o funcionamento do Azure Functions e sua particularidades, com isso podemos notar que essa é uma ferramenta poderosa e que elimina a necessidade de preocupação com questões de infraestrutura para alguns planos.
Outro ponto muito importante é saber planejar corretamente o uso desse recurso em seu projeto e em quais contextos ele pode se encaixar, para evitar qualquer tipo de problema como um interrompimento inesperado de algum processamento e até mesmo surpresas em relação a custos.
E ai, gostou desse post? Quer conversar um pouco mais sobre Azure Functions? Deixe um comentário com suas dúvidas e idéias ou entre em contato comigo através do LinkedIn.
Muito Obrigado!
Referências
Azure Functions documentation | Microsoft Docs
Understanding serverless cold start | Blog e atualizações do Azure | Microsoft Azure