Práticas recomendadas e ferramentas de diagnóstico de Durable Functions
Este artigo detalha algumas práticas recomendadas ao usar Durable Functions. Ele também descreve várias ferramentas para ajudar a diagnosticar problemas durante o desenvolvimento, teste e uso de produção.
Práticas recomendadas
Usar a versão mais recente da extensão de Durable Functions e do SDK
Há dois componentes que um aplicativo de funções usa para executar Durable Functions. Um deles é o SDK de Durable Functions que permite escrever funções de orquestrador, atividade e entidade usando sua linguagem de programação de destino. A outra é a extensão Durable, que é o componente de runtime que realmente executa o código. Com exceção dos aplicativos .NET em processo, o SDK e a extensão têm controle de versão independente.
Manter-se atualizado com a extensão e o SDK mais recentes garante que seu aplicativo se beneficie das melhorias de desempenho, dos recursos e das correções de bugs mais recentes. 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ê abrir um caso de suporte com o Azure.
- Consulte Atualizar a versão da extensão de funções duráveis para obter instruções sobre como obter a versão mais recente da extensão.
- Para garantir que você esteja 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 Durable Functions
O comportamento de reprodução do código do orquestrador cria restrições quanto ao tipo de código que você pode escrever em uma função do orquestrador. Um exemplo de restrição é que sua função de orquestrador deve usar APIs determinísticas para que cada vez que ela é reproduzida, ela produza o mesmo resultado.
Observação
O Analisador Roslyn Durable Functions é um analisador de código ativo que guia os usuários do C# na adesão das restrições de código específicas de Durable Functions. Consulte Analisador Roslyn Durable Functions para obter instruções sobre como habilitá-lo no Visual Studio e Visual Studio Code.
Familiarize-se com as configurações de desempenho Azure Functions da linguagem de programação
Usando as configurações padrão, o runtime da linguagem selecionada pode impor restrições de simultaneidade estritas às suas funções. Por exemplo: apenas permitir que uma função seja executada por vez em uma determinada VM. Essas restrições geralmente podem ser reduzidas ajustando as configurações de simultaneidade e desempenho da sua linguagem. Se você estiver procurando otimizar o desempenho de seu aplicativo Durable Functions, precisará se familiarizar com essas configurações.
Abaixo está uma lista não exaustiva de algumas das linguagens que geralmente se beneficiam do ajuste fino de suas configurações de desempenho e simultaneidade e suas diretrizes para fazer isso.
Garantir nomes exclusivos do Hub de Tarefas por aplicativo
Vários aplicativos Durable Function 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 em 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 um comportamento indefinido, incluindo orquestrações inesperadamente "presas" no estado Pendente ou de Execução.
A única exceção é se você implantar cópias do mesmo aplicativo em várias regiões; Nesse caso, você pode usar o mesmo hub de tarefas para as cópias.
Siga as diretrizes ao implantar alterações de código em orquestradores em execução
É inevitável que funções sejam adicionadas, removidas e alteradas ao longo do tempo de vida de um aplicativo. Exemplos de alterações interruptivas comuns incluem alteração de assinaturas de função de atividade ou entidade e 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 implantado incorretamente, as alterações de código podem levar a falhas de orquestrações com um erro não determinístico, ficar preso indefinidamente, degradação do desempenho etc. Consulte as estratégias de mitigação recomendadas ao fazer alterações de código que podem afetar a execução de orquestrações.
Manter entradas e saídas de função o menor possível
Você poderá encontrar problemas de memória se fornecer entradas e saídas grandes de e para APIs do Durable Functions.
Entradas e saídas para APIs do Durable Functions são serializadas no histórico de orquestração. Isso significa que entradas e saídas grandes podem, ao longo do tempo, contribuir muito para que um histórico de orquestradores cresça sem associação, o que corre o risco de causar exceções de memória durante a reprodução.
Para atenuar o impacto de entradas e saídas grandes para APIs, você pode optar por delegar algum trabalho a sub-orquestradores. Isso ajuda a balancear a carga da memória do histórico de um único orquestrador para vários, mantendo, portanto, o volume de memória de históricos individuais pequeno.
Dito isso, a melhor prática para lidar com dados grandes é mantê-los no armazenamento externo e apenas materializar esses dados dentro de Atividades, quando necessário. Ao adotar essa abordagem, em vez de comunicar os próprios dados como entradas e/ou saídas de APIs Durable Functions, 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 acontece com as entradas e saídas das APIs do Durable Functions, se o estado explícito de uma entidade for muito grande, poderá encontrar problemas de memória. Em particular, um estado de entidade precisa ser serializado e desserializado do armazenamento em qualquer solicitação, portanto, estados grandes adicionam latência de serialização a cada invocação. Portanto, se uma entidade precisar rastrear grandes dados, é 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.
Ajustar as configurações de simultaneidade do Durable Functions
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 de CPU, conexões de rede etc. Em muitos casos, isso não deveria ser uma preocupação porque o dimensionamento e a limitação de itens de trabalho são tratados automaticamente para você. Dito isso, se você estiver enfrentando problemas de desempenho (como orquestradores demorando muito para serem concluídos, estão presos em pendentes etc.) ou estão fazendo testes de desempenho, você pode configurar limites de simultaneidade no arquivo host.json.
Observação
Isso não é uma substituição para ajustar as configurações de desempenho e simultaneidade do seu runtime de linguagem no Azure Functions. As configurações de simultaneidade Durable Functions determinam apenas quanto trabalho pode ser atribuído a uma determinada VM por vez, mas não determina o grau de paralelismo no processamento que funciona dentro da VM. Este último requer ajuste das configurações de desempenho do runtime de 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, escalonamento, travamentos, etc.), seu aplicativo pode receber duplicatas do mesmo evento externo. Portanto, recomendamos que os eventos externos contenham um ID que permita que sejam desduplicados manualmente em orquestradores.
Observação
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 Azure Storage padrão. Dito isso, ainda é recomendado que os eventos externos tenham nomes exclusivos para que o código seja portável entre back-ends.
Investir em testes de estresse
Assim como acontece com qualquer coisa relacionada ao desempenho, as configurações e a arquitetura de simultaneidade ideais do seu aplicativo dependem, em última análise, da carga de trabalho do seu aplicativo. Portanto, é recomendável que os usuários invistam em um agente de teste de desempenho que simule a carga de trabalho esperada e o usem para executar experimentos de desempenho e confiabilidade em seu aplicativo.
Evitar dados confidenciais em entradas, saídas e exceções
Entradas e saídas (inclusive exceções) de e para APIs de Durable Functions são duradouramente persistidos no provedor de armazenamento de 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 provedor de armazenamento poderá obtê-los. Para lidar com dados confidenciais com segurança, é recomendável que os usuários efetuem fetch 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 impedir que dados confidenciais vazem nos recursos de armazenamento.
Observação
Essa orientação também se aplica à API do orquestrador CallHttp
, que também persiste seus conteúdos de solicitação e resposta no armazenamento. Se os pontos de extremidade HTTP de destino exigirem autenticação, o que pode ser confidencial, é recomendável que os usuários implementem a chamada HTTP dentro de uma atividade ou usem o suporte interno de identidade gerenciada oferecido por CallHttp
, em que não persiste nenhuma credenciais no armazenamento.
Dica
Da mesma forma, evite registrar em log dados que contenham segredos, pois qualquer pessoa com acesso de leitura aos seus logs (por exemplo, no Application Insights), poderia obter esses segredos.
Ferramentas de diagnóstico
Há várias ferramentas disponíveis para ajudá-lo a diagnosticar problemas.
Logs da estrutura de tarefas durável e Durable Functions
Extensão Durable Functions
A extensão Durable emite eventos de acompanhamento que permitem rastrear a execução de uma orquestração de ponta a ponta. Eles podem ser encontrados e consultados usando a ferramenta Application Insights Analytics no portal do Azure. O detalhamento dos dados de acompanhamento emitidos pode ser configurado na seção logger
(Functions 1.x) ou logging
(Functions 2.0.x) do arquivo host.jason. Consulte detalhes de configuração.
Estrutura de Tarefa Durable
A partir da versão v2.3.0 da extensão Durable, os logs emitidos pelo DTFx (Durable Task Framework) subjacente também estão disponíveis para coleta. Consulte detalhes sobre como habilitar esses logs.
Portal do Azure
Diagnosticar e resolver problemas
O Diagnóstico do Aplicativo de Funções do Azure é um recurso útil no portal do Azure para monitorar e diagnosticar possíveis problemas em seu aplicativo. Ele também fornece sugestões para ajudar a resolver problemas com base no diagnóstico. Consulte Diagnóstico do Aplicativo de Funções do Azure.
Rastreamentos de Orquestração do Durable Functions
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. Ao examinar a lista de funções dentro de seu aplicativo Azure Functions, você verá uma coluna de Monitoramento que contém links para os rastreamentos. Você precisa ter o Applications Insights habilitado para seu aplicativo para obter essas informações.
Extensão Durable Functions Monitor
Essa é uma extensão Visual Studio Code que fornece uma interface do usuário para monitorar, gerenciar e depurar suas instâncias de orquestração.
Analisador Roslyn
O Analisador Roslyn Durable Functions é um analisador de código ativo que guia os usuários do C# na adesão das restrições de código específicas do Durable Functions. Consulte Analisador Roslyn Durable Functions 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.