Práticas recomendadas para funções confiáveis do Azure
O Azure Functions é uma experiência de computação sob demanda orientada a eventos que estende a plataforma de aplicativo existente do Serviço de Aplicativo do Azure com recursos para implementar código acionado por eventos que ocorrem no Azure, em serviços de terceiros e em sistemas locais. O Functions permite criar soluções conectando-se a fontes de dados ou soluções de mensagens, o que facilita o processamento e a reação a eventos. O Functions é executado em data centers do Azure, que são complexos com muitos componentes integrados. Em um ambiente de nuvem hospedado, espera-se que as VMs possam ocasionalmente reiniciar ou mover, e atualizações de sistemas ocorrerão. Seus aplicativos de funções também provavelmente dependem de APIs externas, Serviços do Azure e outros bancos de dados, que também são propensos a falta de confiabilidade periódica.
Este artigo detalha algumas práticas recomendadas para projetar e implantar aplicativos funcionais eficientes que permanecem íntegros e têm um bom desempenho em um ambiente baseado em nuvem.
Escolha o plano de hospedagem correto
Ao criar um aplicativo de função no Azure, você deve escolher um plano de hospedagem para seu aplicativo. O plano escolhido tem um efeito sobre o desempenho, a confiabilidade e o custo. Estes são os planos de hospedagem fornecidos pelo Azure Functions:
Importante
O plano Flex Consumption está atualmente em pré-visualização.
No contexto da plataforma App Service, o plano Premium usado para hospedar dinamicamente suas funções é o plano Elastic Premium (EP). Existem outros planos Dedicados (Serviço de Aplicativo) chamados Premium. Para saber mais, consulte o artigo do plano Premium.
O plano de hospedagem escolhido determina os seguintes comportamentos:
- Como seu aplicativo de função é dimensionado com base na demanda e como a alocação de instâncias é gerenciada.
- Os recursos disponíveis para cada instância do aplicativo de função.
- Suporte para funcionalidades avançadas, como conectividade de Rede Virtual do Azure.
Para saber mais sobre como escolher o plano de hospedagem correto e para obter uma comparação detalhada entre os planos, consulte Opções de hospedagem do Azure Functions.
É importante que você escolha o plano correto ao criar seu aplicativo de função. O Functions fornece uma capacidade limitada de alternar seu plano de hospedagem, principalmente entre os planos Consumo e Elastic Premium. Para saber mais, consulte Planejar a migração.
Configurar o armazenamento corretamente
O Functions requer que uma conta de armazenamento esteja associada ao seu aplicativo de funções. A conexão da conta de armazenamento é usada pelo host Functions para operações como gerenciamento de gatilhos e execução de funções de log. Ele também é usado ao dimensionar dinamicamente aplicativos de função. Para saber mais, consulte Considerações sobre armazenamento para o Azure Functions.
Um sistema de arquivos ou uma conta de armazenamento mal configurada em seu aplicativo de função pode afetar o desempenho e a disponibilidade de suas funções. Para obter ajuda com a solução de problemas de uma conta de armazenamento configurada incorretamente, consulte o artigo de solução de problemas de armazenamento .
Configurações de conexão de armazenamento
Os aplicativos de função que são dimensionados dinamicamente podem ser executados a partir de um ponto de extremidade do Azure Files em sua conta de armazenamento ou dos servidores de arquivos associados às suas instâncias dimensionadas. Esse comportamento é controlado pelas seguintes configurações do aplicativo:
Essas configurações só são suportadas quando você está executando em um plano Premium ou em um plano de consumo no Windows.
Quando você cria seu aplicativo de função no portal do Azure ou usando a CLI do Azure ou o Azure PowerShell, essas configurações são criadas para seu aplicativo de função quando necessário. Ao criar seus recursos a partir de um modelo do Azure Resource Manager (modelo ARM), você também precisa incluir WEBSITE_CONTENTAZUREFILECONNECTIONSTRING
no modelo.
Em sua primeira implantação usando um modelo ARM, não inclua WEBSITE_CONTENTSHARE
, que é gerado para você.
Você pode usar os seguintes exemplos de modelo ARM para ajudar a definir corretamente essas configurações:
- Plano de consumo
- Plano dedicado
- Plano Premium com integração VNET
- Plano de consumo com um slot de implantação
Configuração da conta de armazenamento
Ao criar uma aplicação de funções, tem de criar ou associar a uma conta de Armazenamento do Azure para fins gerais que suporte armazenamento de Blobs, Filas e Tabelas. O Functions depende do Armazenamento do Azure para operações como o gerenciamento de gatilhos e execuções de funções de log. A cadeia de conexão da conta de armazenamento para seu aplicativo de função é encontrada nas configurações e AzureWebJobsStorage
WEBSITE_CONTENTAZUREFILECONNECTIONSTRING
do aplicativo.
Tenha em mente as seguintes considerações ao criar essa conta de armazenamento:
Para reduzir a latência, crie a conta de armazenamento na mesma região do aplicativo de função.
Para melhorar o desempenho na produção, use uma conta de armazenamento separada para cada aplicativo de função. Isso é especialmente verdadeiro com funções duráveis e funções acionadas por Hubs de Eventos.
Para funções acionadas por Hubs de Eventos, não use uma conta com o Armazenamento Data Lake habilitado.
Tratamento de grandes conjuntos de dados
Ao executar no Linux, você pode adicionar armazenamento extra montando um compartilhamento de arquivos. Montar um compartilhamento é uma maneira conveniente para uma função processar um grande conjunto de dados existente. Para saber mais, consulte Montar compartilhamentos de arquivos.
Organize as suas funções
Como parte de sua solução, você provavelmente desenvolve e publica várias funções. Essas funções geralmente são combinadas em um único aplicativo de função, mas também podem ser executadas em aplicativos de função separados. Nos planos de hospedagem Premium e Dedicado (Serviço de Aplicativo), vários aplicativos funcionais também podem compartilhar os mesmos recursos executando no mesmo plano. A forma como você agrupa suas funções e aplicativos de função pode afetar o desempenho, o dimensionamento, a configuração, a implantação e a segurança de sua solução geral.
Para o plano Consumo e Premium, todas as funções em um aplicativo de função são dimensionadas dinamicamente juntas.
Para obter mais informações sobre como organizar suas funções, consulte Práticas recomendadas de organização de funções.
Otimize implantações
Ao implantar um aplicativo de função, é importante ter em mente que a unidade de implantação de funções no Azure é o aplicativo de função. Todas as funções em um aplicativo de função são implantadas ao mesmo tempo, geralmente a partir do mesmo pacote de implantação.
Considere estas opções para uma implantação bem-sucedida:
Faça com que suas funções sejam executadas a partir do pacote de implantação. Esta abordagem de execução a partir do pacote oferece os seguintes benefícios:
- Reduz o risco de problemas de bloqueio de cópia de ficheiros.
- Pode ser implantado diretamente em um aplicativo de produção, o que aciona uma reinicialização.
- Saiba que todos os arquivos do pacote estão disponíveis para seu aplicativo.
- Melhora o desempenho de implantações de modelo ARM.
- Pode reduzir os tempos de arranque a frio, particularmente para funções JavaScript com grandes árvores de pacotes npm.
Considere o uso da implantação contínua para conectar implantações à sua solução de controle do código-fonte. As implantações contínuas também permitem que você execute a partir do pacote de implantação.
Para hospedagem de plano Premium, considere adicionar um gatilho de aquecimento para reduzir a latência quando novas instâncias forem adicionadas. Para saber mais, consulte Gatilho de aquecimento do Azure Functions.
Para minimizar o tempo de inatividade da implantação e poder reverter as implantações, considere o uso de slots de implantação. Para saber mais, consulte Slots de implantação do Azure Functions.
Escreva funções robustas
Há vários princípios de design que você pode seguir ao escrever seu código de função que ajudam com o desempenho geral e a disponibilidade de suas funções. Estes princípios incluem:
- Evite funções de longa duração.
- Planeje a comunicação entre funções.
- Escreva funções para serem sem monitoração de estado.
- Escreva funções defensivas.
Como falhas transitórias são comuns na computação em nuvem, você deve usar um padrão de repetição ao acessar recursos baseados em nuvem. Muitos gatilhos e ligações já implementam a retry.
Conceber para segurança
A segurança deve ser considerada durante a fase de planeamento e não depois de as suas funções estarem prontas a funcionar. Para saber como desenvolver e implantar funções com segurança, consulte Protegendo o Azure Functions.
Considere a simultaneidade
À medida que a demanda aumenta em seu aplicativo de função como resultado de eventos recebidos, os aplicativos de função executados nos planos Consumo e Premium são expandidos. É importante entender como seu aplicativo de função responde ao carregamento e como os gatilhos podem ser configurados para lidar com eventos de entrada. Para obter uma visão geral, consulte Dimensionamento controlado por eventos no Azure Functions.
Os planos dedicados (Serviço de Aplicativo) exigem que você forneça a expansão de seus aplicativos de função.
Contagem de processos de trabalho
Em alguns casos, é mais eficiente lidar com a carga criando vários processos, chamados processos de trabalho de linguagem, na instância antes da expansão. O número máximo de processos de trabalho linguístico permitido é controlado pela configuração FUNCTIONS_WORKER_PROCESS_COUNT . O padrão para essa configuração é 1
, o que significa que vários processos não são usados. Depois que o número máximo de processos é atingido, o aplicativo de função é expandido para mais instâncias para lidar com a carga. Essa configuração não se aplica às funções de biblioteca de classes C#, que são executadas no processo de host.
Ao usar FUNCTIONS_WORKER_PROCESS_COUNT
em um plano Premium ou Dedicado (Serviço de Aplicativo), lembre-se do número de núcleos fornecidos pelo seu plano. Por exemplo, o plano EP2
Premium fornece dois núcleos, então você deve começar com um valor de 2
e aumentar em dois conforme necessário, até o máximo.
Configuração do acionador
Ao planejar a taxa de transferência e o dimensionamento, é importante entender como os diferentes tipos de gatilhos processam eventos. Alguns gatilhos permitem controlar os comportamentos de envio em lote e gerenciar a simultaneidade. Muitas vezes, ajustar os valores nessas opções pode ajudar cada instância a ser dimensionada adequadamente para as demandas das funções invocadas. Essas opções de configuração são aplicadas a todos os gatilhos em um aplicativo de função e são mantidas no arquivo de host.json do aplicativo. Consulte a seção Configuração da referência de gatilho específica para obter detalhes sobre as configurações.
Para saber mais sobre como o Functions processa fluxos de mensagens, consulte Processamento de eventos confiável do Azure Functions.
Planejar conexões
As aplicações funcionais em execução no Plano de consumo estão sujeitas a limites de ligação. Estes limites são aplicados por instância. Devido a esses limites e como uma prática recomendada geral, você deve otimizar suas conexões de saída a partir do seu código de função. Para saber mais, consulte Gerenciar conexões no Azure Functions.
Considerações específicas do idioma
Para a língua que escolher, tenha em mente as seguintes considerações:
Use tokens de cancelamento (somente em processo).
Maximize a disponibilidade
O arranque a frio é uma consideração fundamental para arquiteturas sem servidor. Para saber mais, consulte Arranques a frio. Se o arranque a frio for uma preocupação para o seu cenário, pode encontrar um mergulho mais profundo no post Compreender o arranque a frio sem servidor .
O plano Premium é o plano recomendado para reduzir os arranques a frios, mantendo a escala dinâmica. Você pode usar as seguintes orientações para reduzir partidas a frio e melhorar a disponibilidade em todos os três planos de hospedagem.
Planear | Orientação |
---|---|
Plano Premium | • Implemente um gatilho de aquecimento em seu aplicativo de função • Defina os valores para instâncias Always-Ready e limite Max Burst • Use o suporte a gatilhos de rede virtual ao usar gatilhos não-HTTP em uma rede virtual |
Planos dedicados | • Executar em pelo menos duas instâncias com a Verificação de Estado de Funcionamento do Serviço de Aplicações do Azure ativada • Implementar dimensionamento automático |
Plano de consumo | • Revise seu uso de padrões Singleton e as configurações de simultaneidade para ligações e gatilhos para evitar colocar limites artificialmente em como seu aplicativo de função é dimensionado. • Revise a configuração, que pode limitar a functionAppScaleLimit expansão• Verifique se há um limite de Cota de Uso Diário (GB-Sec) definido durante o desenvolvimento e os testes. Considere remover esse limite em ambientes de produção. |
Monitorize de forma eficaz
O Azure Functions oferece integração interna com o Azure Application Insights para monitorar a execução da função e os rastreamentos escritos a partir do código. Para saber mais, consulte Monitorar o Azure Functions. O Azure Monitor também fornece recursos para monitorar a integridade do próprio aplicativo de função. Para saber mais, consulte Monitoramento com o Azure Monitor.
Você deve estar ciente das seguintes considerações ao usar a integração do Application Insights para monitorar suas funções:
Verifique se a configuração do aplicativo AzureWebJobsDashboard foi removida. Essa configuração era suportada na versão mais antiga do Functions. Se existir, a remoção
AzureWebJobsDashboard
melhora o desempenho das suas funções.Analise os logs do Application Insights. Se faltarem dados que você espera encontrar, considere ajustar as configurações de amostragem para capturar melhor seu cenário de monitoramento. Você pode usar a
excludedTypes
configuração para excluir determinados tipos da amostragem, comoRequest
ouException
. Para saber mais, consulte Configurar amostragem.
O Azure Functions também permite enviar logs gerados pelo sistema e pelo usuário para os Logs do Azure Monitor. A integração com os Logs do Azure Monitor está atualmente em visualização.
Redundância de compilação
As necessidades da sua empresa podem exigir que as suas funções estejam sempre disponíveis, mesmo durante uma interrupção do centro de dados. Para saber como usar uma abordagem multirregional para manter suas funções críticas sempre em execução, consulte Recuperação de desastres geográficos e alta disponibilidade do Azure Functions.