Melhores práticas e ferramentas de diagnóstico do Durable Functions

Este artigo detalha algumas práticas recomendadas ao usar funções duráveis. Ele também descreve várias ferramentas para ajudar a diagnosticar problemas durante o desenvolvimento, teste e uso da produção.

Melhores práticas

Use a versão mais recente da extensão Durable Functions e do SDK

Há dois componentes que um aplicativo de função usa para executar funções duráveis. Um deles é o SDK de Funções Duráveis que permite escrever funções de orquestrador, atividade e entidade usando sua linguagem de programação de destino. A outra é a extensão Durável, que é o componente de tempo de execução que realmente executa o código. Com exceção dos aplicativos em processo do .NET, o SDK e a extensão são versionados independentemente.

Manter-se atualizado com a extensão e o SDK mais recentes garante que seu aplicativo se beneficie das mais recentes melhorias de desempenho, recursos e correções de bugs. A atualização para as versões mais recentes também garante que a Microsoft possa coletar a telemetria de diagnóstico mais recente para ajudar a acelerar o processo de investigação quando você abre um caso de suporte com o Azure.

  • Consulte Atualizar versão de extensão de funções duráveis para obter instruções sobre como obter a versão de extensão mais recente.
  • Para garantir que você está usando a versão mais recente do SDK, verifique o gerenciador de pacotes do idioma que você está usando.

Aderir às restrições de código do Durable Functions

O comportamento de repetição do código do orchestrator cria restrições sobre o tipo de código que você pode escrever em uma função do orchestrator. Um exemplo de restrição é que sua função orchestrator deve usar APIs determinísticas para que, cada vez que for reproduzida, produza o mesmo resultado.

Nota

O Durable Functions Roslyn Analyzer é um analisador de código ao vivo que orienta os usuários do C# a aderir às restrições de código específicas do Durable Functions. Consulte Durable Functions Roslyn Analyzer para obter instruções sobre como habilitá-lo no Visual Studio e Visual Studio Code.

Familiarize-se com as configurações de desempenho do Azure Functions da sua linguagem de programação

Usando as configurações padrão, o tempo de execução do idioma selecionado pode impor restrições rígidas de simultaneidade às suas funções. Por exemplo: permitir que apenas 1 função seja executada de cada vez em uma determinada VM. Essas restrições geralmente podem ser relaxadas ajustando as configurações de simultaneidade e desempenho do seu idioma. Se você está procurando otimizar o desempenho do seu aplicativo Durable Functions, precisará se familiarizar com essas configurações.

Abaixo está uma lista não exaustiva de alguns dos idiomas que muitas vezes se beneficiam do ajuste fino de suas configurações de desempenho e simultaneidade, e suas diretrizes para fazê-lo.

Garantir nomes exclusivos do Hub de Tarefas por aplicativo

Vários aplicativos de função durável podem compartilhar a mesma conta de armazenamento. Por padrão, o nome do aplicativo é usado como o nome do hub de tarefas, o que garante que o compartilhamento acidental de hubs de tarefas não aconteça. Se você precisar configurar explicitamente os nomes do hub de tarefas para seus aplicativos no host.json, deverá garantir que os nomes sejam exclusivos. Caso contrário, os vários aplicativos competirão por mensagens, o que pode resultar em comportamento indefinido, incluindo orquestrações ficando inesperadamente "presas" no estado Pendente ou em Execução.

A única exceção é se você implantar cópias do mesmo aplicativo em várias regiões, neste caso, você pode usar o mesmo hub de tarefas para as cópias.

Siga as orientações ao implantar alterações de código em orquestradores em execução

É inevitável que as funções sejam adicionadas, removidas e alteradas ao longo da vida útil de um aplicativo. Exemplos de alterações comuns incluem a alteração de assinaturas de atividade ou função de entidade e a alteração da lógica do orquestrador. Essas alterações são um problema quando afetam orquestrações que ainda estão em execução. Se implantadas incorretamente, as alterações de código podem levar a orquestrações falhando com um erro não determinístico, ficando preso indefinidamente, degradação de desempenho, etc. Consulte as estratégias de mitigação recomendadas ao fazer alterações de código que possam afetar orquestrações em execução.

Mantenha as entradas e saídas de função tão pequenas quanto possível

Você pode ter problemas de memória se fornecer grandes entradas e saídas de e para APIs de funções duráveis.

As entradas e saídas para APIs de funções duráveis são serializadas no histórico de orquestração. Isso significa que grandes entradas e saídas podem, com o tempo, contribuir muito para que a história de um orquestrador cresça sem limites, o que corre o risco de causar exceções de memória durante a reprodução.

Para atenuar o impacto de grandes entradas e saídas para APIs, você pode optar por delegar algum trabalho a suborquestradores. Isso ajuda a equilibrar a carga de memória do histórico de um único orquestrador para vários orquestradores, mantendo assim a pegada de memória de históricos individuais pequena.

Dito isto, a melhor prática para lidar com grandes volumes de dados é mantê-los em armazenamento externo e apenas materializar esses dados dentro das Atividades, quando necessário. Ao adotar essa abordagem, em vez de comunicar os dados em si como entradas e/ou saídas de APIs de Funções Duráveis, você pode passar algum identificador leve que permite recuperar esses dados do armazenamento externo quando necessário em suas Atividades.

Mantenha os dados da entidade pequenos

Assim como para entradas e saídas para APIs de funções duráveis, se o estado explícito de uma entidade for muito grande, você poderá ter problemas de memória. Em particular, um estado de Entidade precisa ser serializado e desserializado do armazenamento em qualquer solicitação, para que estados grandes adicionem latência de serialização a cada invocação. Portanto, se uma Entidade precisar rastrear dados grandes, é recomendável descarregar os dados para armazenamento externo e rastrear algum identificador leve na entidade que permita materializar os dados do armazenamento quando necessário.

Ajuste suas configurações de simultaneidade de Funções Duráveis

Uma única instância de trabalho pode executar vários itens de trabalho simultaneamente para aumentar a eficiência. No entanto, processar muitos itens de trabalho simultaneamente corre o risco de esgotar recursos como capacidade da CPU, conexões de rede, etc. Em muitos casos, isso não deve ser uma preocupação, porque dimensionar e limitar itens de trabalho são manipulados automaticamente para você. Dito isso, se você estiver enfrentando problemas de desempenho (como orquestradores demorando muito para terminar, ficando presos em pendências, etc.) ou fazendo testes de desempenho, você pode configurar limites de simultaneidade no arquivo host.json.

Nota

Isso não substitui o ajuste fino das configurações de desempenho e simultaneidade do seu tempo de execução de linguagem no Azure Functions. As configurações de simultaneidade de Funções Duráveis determinam apenas quanto trabalho pode ser atribuído a uma determinada VM de cada vez, mas não determinam o grau de paralelismo no processamento que funciona dentro da VM. Este último requer o ajuste fino das configurações de desempenho do tempo de execução da linguagem.

Use nomes exclusivos para seus eventos externos

Tal como acontece com as funções de atividade, os eventos externos têm uma garantia de entrega pelo menos uma vez . Isso significa que, sob certas condições raras (que podem ocorrer durante reinicializações, dimensionamento, falhas, etc.), seu aplicativo pode receber duplicatas do mesmo evento externo. Portanto, recomendamos que os eventos externos contenham uma ID que permita que eles sejam manualmente eliminados da duplicação em orquestradores.

Nota

O provedor de armazenamento MSSQL consome eventos externos e atualiza o estado do orquestrador transacionalmente, portanto, nesse back-end, não deve haver risco de eventos duplicados, ao contrário do provedor de armazenamento padrão do Armazenamento do Azure. Dito isso, ainda é recomendado que os eventos externos tenham nomes exclusivos para que o código seja portátil entre back-ends.

Invista em testes de esforço

Como em qualquer coisa relacionada ao desempenho, as configurações de simultaneidade ideais e a arquitetura do seu aplicativo dependem, em última análise, da carga de trabalho do aplicativo. Portanto, é recomendável que os usuários invistam em um conjunto de testes de desempenho que simule sua carga de trabalho esperada e o usem para executar experimentos de desempenho e confiabilidade para seu aplicativo.

Evite dados confidenciais em entradas, saídas e exceções

As entradas e saídas (incluindo exceções) de e para APIs de Funções Duráveis persistem de forma durável no provedor de armazenamento de sua escolha. Se essas entradas, saídas ou exceções contiverem dados confidenciais (como segredos, cadeias de conexão, informações de identificação pessoal, etc.), qualquer pessoa com acesso de leitura aos recursos do seu provedor de armazenamento poderá obtê-los. Para lidar com dados confidenciais com segurança, é recomendável que os usuários busquem esses dados em funções de atividade do Azure Key Vault ou variáveis de ambiente e nunca comuniquem esses dados diretamente a orquestradores ou entidades. Isso deve ajudar a evitar que dados confidenciais vazem para seus recursos de armazenamento.

Nota

Esta orientação também se aplica à API do CallHttp orchestrator, que também persiste suas cargas úteis de solicitação e resposta no armazenamento. Se seus pontos de extremidade HTTP de destino exigirem autenticação, que pode ser confidencial, é recomendável que os usuários implementem a chamada HTTP dentro de uma atividade ou usem o suporte de identidade gerenciado interno oferecido pelo CallHttp, que não persiste nenhuma credencial para armazenamento.

Gorjeta

Da mesma forma, evite registrar dados que contenham segredos, pois qualquer pessoa com acesso de leitura aos seus logs (por exemplo, no Application Insights) poderá obter esses segredos.

Ferramentas de diagnóstico

Existem várias ferramentas disponíveis para ajudá-lo a diagnosticar problemas.

Funções duráveis e logs duráveis da estrutura de tarefas

Extensão de funções duráveis

A extensão Durable emite eventos de rastreamento que permitem rastrear a execução de ponta a ponta de uma orquestração. Esses eventos de acompanhamento podem ser encontrados e consultados usando a ferramenta Application Insights Analytics no portal do Azure. A detalhamento dos dados de rastreamento emitidos pode ser configurada logger na seção (Funções 1.x) ou logging (Funções 2.0) do arquivo host.json. Consulte os detalhes da configuração.

Quadro de tarefas duradouro

A partir da v2.3.0 da extensão Durável, os logs emitidos pelo DTFx (Durable Task Framework) subjacente também estão disponíveis para coleta. Veja detalhes sobre como ativar esses logs.

Portal do Azure

Diagnosticar e resolver problemas

O Diagnóstico do Aplicativo de Função do Azure é um recurso útil no portal do Azure para monitorar e diagnosticar possíveis problemas em seu aplicativo. Também fornece sugestões para ajudar a resolver problemas com base no diagnóstico. Consulte Diagnóstico do Aplicativo de Função do Azure.

Traços de orquestração de funções duráveis

O portal do Azure fornece detalhes de rastreamento de orquestração para ajudá-lo a entender o status de cada instância de orquestração e rastrear a execução de ponta a ponta. Quando você olhar para a lista de funções dentro do seu aplicativo Azure Functions, verá uma coluna Monitor que contém links para os rastreamentos. Você precisa ter o Applications Insights habilitado para seu aplicativo para obter essas informações.

Extensão do monitor de funções duráveis

Esta é uma extensão do Visual Studio Code que fornece uma interface do usuário para monitorar, gerenciar e depurar suas instâncias de orquestração.

Analisador Roslyn

O Durable Functions Roslyn Analyzer é um analisador de código ao vivo que orienta os usuários do C# a aderir às restrições de código específicas do Durable Functions. Consulte Durable Functions Roslyn Analyzer para obter instruções sobre como habilitá-lo no Visual Studio e Visual Studio Code.

Suporte

Para perguntas e suporte, você pode abrir um problema em um dos repositórios do GitHub abaixo. Ao relatar um bug no Azure, incluindo informações como IDs de instância afetadas, intervalos de tempo em UTC mostrando o problema, o nome do aplicativo (se possível) e a região de implantação acelerarão muito as investigações.