Otimizar o desempenho e a fiabilidade das Funções AzureOptimize the performance and reliability of Azure Functions

Este artigo fornece orientações para melhorar o desempenho e a fiabilidade das suas aplicações de função sem servidores.This article provides guidance to improve the performance and reliability of your serverless function apps.

Melhores práticas geraisGeneral best practices

Seguem-se as melhores práticas na forma como constrói e arquiteta as suas soluções sem servidores utilizando funções Azure.The following are best practices in how you build and architect your serverless solutions using Azure Functions.

Evite funções de longo prazoAvoid long running functions

Funções grandes e de longa duração podem causar problemas inesperados de tempo.Large, long-running functions can cause unexpected timeout issues. Para saber mais sobre os intervalos para um determinado plano de hospedagem, consulte a duração do tempo de tempo da aplicação de funções.To learn more about the timeouts for a given hosting plan, see function app timeout duration.

Uma função pode tornar-se grande devido a muitas dependências de Node.js.A function can become large because of many Node.js dependencies. As dependências de importação também podem causar um aumento dos tempos de carga que resultam em tempos inesperados.Importing dependencies can also cause increased load times that result in unexpected timeouts. As dependências são carregadas explicitamente e implicitamente.Dependencies are loaded both explicitly and implicitly. Um único módulo carregado pelo seu código pode carregar os seus próprios módulos adicionais.A single module loaded by your code may load its own additional modules.

Sempre que possível, refactor arrefactor grandes funções em conjuntos de funções menores que funcionam em conjunto e devolvem respostas rapidamente.Whenever possible, refactor large functions into smaller function sets that work together and return responses fast. Por exemplo, uma função de gatilho webhook ou HTTP pode exigir uma resposta de reconhecimento dentro de um determinado prazo; é comum que os webhooks exijam uma resposta imediata.For example, a webhook or HTTP trigger function might require an acknowledgment response within a certain time limit; it's common for webhooks to require an immediate response. Pode passar a carga de gatilho HTTP para uma fila a ser processada por uma função de gatilho de fila.You can pass the HTTP trigger payload into a queue to be processed by a queue trigger function. Esta abordagem permite adiar o trabalho real e devolver uma resposta imediata.This approach lets you defer the actual work and return an immediate response.

Comunicação de funções cruzadasCross function communication

Funções Duráveis e Aplicações Lógicas Azure são construídas para gerir transições estatais e comunicação entre múltiplas funções.Durable Functions and Azure Logic Apps are built to manage state transitions and communication between multiple functions.

Se não utilizar funções duráveis ou aplicações lógicas para se integrar com múltiplas funções, o melhor é utilizar filas de armazenamento para comunicação transfunção.If not using Durable Functions or Logic Apps to integrate with multiple functions, it's best to use storage queues for cross-function communication. A razão principal é que as filas de armazenamento são mais baratas e muito mais fáceis de fornecer do que outras opções de armazenamento.The main reason is that storage queues are cheaper and much easier to provision than other storage options.

As mensagens individuais numa fila de armazenamento são limitadas em tamanho a 64 KB.Individual messages in a storage queue are limited in size to 64 KB. Se precisar de passar mensagens maiores entre funções, uma fila de ônibus de serviço Azure poderia ser usada para suportar tamanhos de mensagens até 256 KB no nível Standard e até 1 MB no nível Premium.If you need to pass larger messages between functions, an Azure Service Bus queue could be used to support message sizes up to 256 KB in the Standard tier, and up to 1 MB in the Premium tier.

Os tópicos do ônibus de serviço são úteis se necessitar de filtragem de mensagens antes de ser processado.Service Bus topics are useful if you require message filtering before processing.

Os centros de eventos são úteis para apoiar comunicações de alto volume.Event hubs are useful to support high volume communications.

Escrever funções para ser apátridaWrite functions to be stateless

As funções devem ser apátridas e idempotentes, se possível.Functions should be stateless and idempotent if possible. Associe todas as informações de estado necessárias com os seus dados.Associate any required state information with your data. Por exemplo, uma ordem que está a ser processada teria provavelmente um membro state associado.For example, an order being processed would likely have an associated state member. Uma função poderia processar uma ordem baseada nesse estado enquanto a função em si permanece apátrida.A function could process an order based on that state while the function itself remains stateless.

Funções idempotentes são especialmente recomendadas com gatilhos temporizadores.Idempotent functions are especially recommended with timer triggers. Por exemplo, se tiver algo que deve funcionar uma vez por dia, escreva-o para que possa funcionar a qualquer momento durante o dia com os mesmos resultados.For example, if you have something that absolutely must run once a day, write it so it can run anytime during the day with the same results. A função pode sair quando não há trabalho para um dia em particular.The function can exit when there's no work for a particular day. Além disso, se uma corrida anterior não tiver terminado, a próxima corrida deve retomar onde ficou parada.Also if a previous run failed to complete, the next run should pick up where it left off.

Escrever funções defensivasWrite defensive functions

Assuma que a sua função pode encontrar uma exceção a qualquer momento.Assume your function could encounter an exception at any time. Desenhe as suas funções com a capacidade de continuar a partir de um ponto de falha anterior durante a próxima execução.Design your functions with the ability to continue from a previous fail point during the next execution. Considere um cenário que exija as seguintes ações:Consider a scenario that requires the following actions:

  1. Consulta por 10.000 filas numa base de dados.Query for 10,000 rows in a database.
  2. Crie uma mensagem de fila para cada uma dessas filas para processar mais abaixo a linha.Create a queue message for each of those rows to process further down the line.

Dependendo do quão complexo é o seu sistema, pode ter: serviços envolvidos a jusante comportam-se mal, interrupções em rede ou limites de quota atingidos, etc. Tudo isto pode afetar a sua função a qualquer momento.Depending on how complex your system is, you may have: involved downstream services behaving badly, networking outages, or quota limits reached, etc. All of these can affect your function at any time. Precisa desenhar as suas funções para estar preparado para isso.You need to design your functions to be prepared for it.

Como reage o seu código se ocorre uma falha depois de inserir 5.000 desses itens numa fila para processamento?How does your code react if a failure occurs after inserting 5,000 of those items into a queue for processing? Rastreie os itens num conjunto que completou.Track items in a set that you’ve completed. Caso contrário, poderá inseri-los novamente da próxima vez.Otherwise, you might insert them again next time. Esta dupla inserção pode ter um impacto sério no fluxo de trabalho, por isso, torne as suas funções idempotentes.This double-insertion can have a serious impact on your work flow, so make your functions idempotent.

Se um item de fila já foi processado, deixe a sua função não op.If a queue item was already processed, allow your function to be a no-op.

Aproveite as medidas defensivas já previstas para os componentes utilizados na plataforma Funções Azure.Take advantage of defensive measures already provided for components you use in the Azure Functions platform. Por exemplo, consulte o manuseamento de mensagens de fila de veneno na documentação para os gatilhos e encadernaçõesda fila de armazenamento do Azure .For example, see Handling poison queue messages in the documentation for Azure Storage Queue triggers and bindings.

As melhores práticas de escalabilidadeScalability best practices

Há uma série de fatores que impactam a forma como os casos da sua função app escala.There are a number of factors that impact how instances of your function app scale. Os detalhes são fornecidos na documentação para a escalade de funções.The details are provided in the documentation for function scaling. Seguem-se algumas boas práticas para garantir a escalabilidade ideal de uma aplicação de função.The following are some best practices to ensure optimal scalability of a function app.

Partilhar e gerir ligaçõesShare and manage connections

Reutilizar sempre que possível as ligações a recursos externos.Reuse connections to external resources whenever possible. Veja como gerir as ligações em Funções Azure.See how to manage connections in Azure Functions.

Evite partilhar contas de armazenamentoAvoid sharing storage accounts

Quando cria uma aplicação de função, deve associá-la a uma conta de armazenamento.When you create a function app, you must associate it with a storage account. A ligação da conta de armazenamento é mantida na definição da aplicação AzureWebJobsStorage.The storage account connection is maintained in the AzureWebJobsStorage application setting.

Para maximizar o desempenho, use uma conta de armazenamento separada para cada aplicativo de funções.To maximize performance, use a separate storage account for each function app. Isso é particularmente importante quando você tem Durable Functions ou funções disparadas pelo hub de eventos, que geram um alto volume de transações de armazenamento.This is particularly important when you have Durable Functions or Event Hub triggered functions, which both generate a high volume of storage transactions. Quando a lógica do aplicativo interage com o armazenamento do Azure, seja diretamente (usando o SDK de armazenamento) ou por meio de uma das associações de armazenamento, você deve usar uma conta de armazenamento dedicada.When your application logic interacts with Azure Storage, either directly (using the Storage SDK) or through one of the storage bindings, you should use a dedicated storage account. Por exemplo, se você tiver uma função disparada por Hub de eventos gravando alguns dados no armazenamento de BLOBs, use duas contas de armazenamento—uma para o aplicativo de funções e outra para os blobs que estão sendo armazenados pela função.For example, if you have an Event Hub-triggered function writing some data to blob storage, use two storage accounts—one for the function app and another for the blobs being stored by the function.

Não misture o teste e o código de produção na mesma aplicação de funçõesDon't mix test and production code in the same function app

As funções dentro de uma aplicação de função partilham recursos.Functions within a function app share resources. Por exemplo, a memória é partilhada.For example, memory is shared. Se estiver a usar uma aplicação de função em produção, não adicione funções e recursos relacionados com o teste.If you're using a function app in production, don't add test-related functions and resources to it. Pode causar sobrecargas inesperadas durante a execução do código de produção.It can cause unexpected overhead during production code execution.

Tenha cuidado com o que carrega nas suas aplicações de função de produção.Be careful what you load in your production function apps. A memória é média em cada função da aplicação.Memory is averaged across each function in the app.

Se tiver um conjunto partilhado referenciado em múltiplas funções .NET, coloque-o numa pasta partilhada comum.If you have a shared assembly referenced in multiple .NET functions, put it in a common shared folder. Caso contrário, poderia acidentalmente implementar várias versões do mesmo binário que se comportam de forma diferente entre funções.Otherwise, you could accidentally deploy multiple versions of the same binary that behave differently between functions.

Não utilize a verbosa login no código de produção, o que tem um impacto negativo no desempenho.Don't use verbose logging in production code, which has a negative performance impact.

Use código assync mas evite bloquear chamadasUse async code but avoid blocking calls

A programação assíncrona é uma melhor prática recomendada, especialmente quando se estão envolvidas operações de bloqueio de E/S.Asynchronous programming is a recommended best practice, especially when blocking I/O operations are involved.

Em C#, evite sempre fazer referência ao Result imóvel ou chamar Wait método numa Task instância.In C#, always avoid referencing the Result property or calling Wait method on a Task instance. Esta abordagem pode levar à exaustão dos fios.This approach can lead to thread exhaustion.

Dica

Se planeja usar os enlaces de HTTP ou WebHook, planeie evitar o esgotamento de porta que pode ser causado por instâncias impróprias de HttpClient.If you plan to use the HTTP or WebHook bindings, plan to avoid port exhaustion that can be caused by improper instantiation of HttpClient. Para obter mais informações, consulte como gerir ligações nas funções do Azure.For more information, see How to manage connections in Azure Functions.

Utilize vários processos de trabalhadorUse multiple worker processes

Por predefinição, qualquer exemplo de hospedeiro para Funções utiliza um único processo de trabalhador.By default, any host instance for Functions uses a single worker process. Para melhorar o desempenho, especialmente com tempos de execução de roscar como python, use o FUNCTIONS_WORKER_PROCESS_COUNT para aumentar o número de processos de trabalhador por hospedeiro (até 10).To improve performance, especially with single-threaded runtimes like Python, use the FUNCTIONS_WORKER_PROCESS_COUNT to increase the number of worker processes per host (up to 10). As Funções Azure tentam então distribuir uniformemente invocações de funções simultâneas por estes trabalhadores.Azure Functions then tries to evenly distribute simultaneous function invocations across these workers.

O FUNCTIONS_WORKER_PROCESS_COUNT aplica-se a cada anfitrião que as Funções criam ao escalonar a sua aplicação para satisfazer a procura.The FUNCTIONS_WORKER_PROCESS_COUNT applies to each host that Functions creates when scaling out your application to meet demand.

Receba mensagens em lote sempre que possívelReceive messages in batch whenever possible

Alguns gatilhos como o Event Hub permitem receber um lote de mensagens numa única invocação.Some triggers like Event Hub enable receiving a batch of messages on a single invocation. As mensagens de lotação têm um desempenho muito melhor.Batching messages has much better performance. Pode configurar o tamanho máximo do lote no ficheiro host.json conforme detalhado na documentação de referência host.jsonYou can configure the max batch size in the host.json file as detailed in the host.json reference documentation

Para C# funções, pode alterar o tipo para uma matriz fortemente dactilografada.For C# functions, you can change the type to a strongly-typed array. Por exemplo, em vez de EventData sensorEvent a assinatura do método poderia ser EventData[] sensorEvent.For example, instead of EventData sensorEvent the method signature could be EventData[] sensorEvent. Para outras línguas, você precisará definir explicitamente a propriedade cardinalidade na sua function.json para many de modo a permitir o lote como mostrado aqui.For other languages, you'll need to explicitly set the cardinality property in your function.json to many in order to enable batching as shown here.

Configure comportamentos de hospedeiro para lidar melhor com a conmoedaConfigure host behaviors to better handle concurrency

O ficheiro host.json na aplicação de função permite configurar o tempo de execução do hospedeiro e desencadear comportamentos.The host.json file in the function app allows for configuration of host runtime and trigger behaviors. Além de comportamentos de lotação, você pode gerir a concurrency para uma série de gatilhos.In addition to batching behaviors, you can manage concurrency for a number of triggers. Muitas vezes, ajustar os valores nestas opções pode ajudar cada instância a escalar adequadamente para as exigências das funções invocadas.Often adjusting the values in these options can help each instance scale appropriately for the demands of the invoked functions.

As definições no ficheiro host.json aplicam-se em todas as funções dentro da app, numa única instância da função.Settings in the host.json file apply across all functions within the app, within a single instance of the function. Por exemplo, se tivesse uma aplicação de função com duas funções HTTP e pedidos demaxConcurrentRequests definidos para 25, um pedido para qualquer um dos gatilhos HTTP contaria para os 25 pedidos simultâneos partilhados.For example, if you had a function app with two HTTP functions and maxConcurrentRequests requests set to 25, a request to either HTTP trigger would count towards the shared 25 concurrent requests. Quando essa aplicação de funções é dimensionada para 10 instâncias, as duas funções permitem efetivamente 250 pedidos simultâneos (10 instâncias * 25 pedidos simultâneos por exemplo).When that function app is scaled to 10 instances, the two functions effectively allow 250 concurrent requests (10 instances * 25 concurrent requests per instance).

Outras opções de configuração do anfitrião encontram-se no artigo de configuração host.json.Other host configuration options are found in the host.json configuration article.

Passos SeguintesNext steps

Para mais informações, consulte os seguintes recursos:For more information, see the following resources: