Processamento de erros e novas tentativas das Funções do Azure
O processamento de erros no Funções do Azure é importante para o ajudar a evitar dados perdidos, evitar eventos perdidos e monitorizar o estado de funcionamento da sua aplicação. Também é uma forma importante de o ajudar a compreender os comportamentos de repetição dos acionadores baseados em eventos.
Este artigo descreve estratégias gerais para o processamento de erros e as estratégias de repetição disponíveis.
Importante
Estamos a remover o suporte da política de repetição no runtime para acionadores que não o Temporizador, o Kafka e os Hubs de Eventos depois de esta funcionalidade ficar disponível para o público em geral. O suporte da política de repetição de pré-visualização para todos os acionadores que não o Temporizador e os Hubs de Eventos foi removido em dezembro de 2022. Para obter mais informações, consulte a secção Repetições .
Processar erros
Os erros que ocorrem numa função do Azure podem resultar de qualquer um dos seguintes:
- Utilização de acionadores e enlaces de Funções do Azure incorporados
- Chamadas para APIs de serviços subjacentes do Azure
- Chamadas para pontos finais REST
- Chamadas para bibliotecas de cliente, pacotes ou APIs de terceiros
Para evitar a perda de dados ou mensagens perdidas, é importante praticar um bom processamento de erros. Esta secção descreve algumas práticas recomendadas de processamento de erros e fornece ligações para mais informações.
Ativar o Application Insights
Funções do Azure integra-se com o Application Insights para recolher dados de erro, dados de desempenho e registos de runtime. Deve utilizar o Application Insights para detetar e compreender melhor os erros que ocorrem nas execuções de funções. Para saber mais, veja Monitorizar Funções do Azure.
Utilizar o processamento de erros estruturados
Capturar e registar erros é fundamental para monitorizar o estado de funcionamento da sua aplicação. O nível mais alto de qualquer código de função deve incluir um bloco try/catch. No bloco catch, pode capturar e registar erros. Para obter informações sobre os erros que podem ser gerados por enlaces, veja Códigos de erro de enlace.
Planear a estratégia de repetição
Várias extensões de enlaces de Funções fornecem suporte incorporado para repetições. Além disso, o runtime permite-lhe definir políticas de repetição para funções acionadas por Hubs de Eventos, Temporizador, Kafka e Hubs de Eventos. Para saber mais, veja Repetições. Para acionadores que não fornecem comportamentos de repetição, poderá querer implementar o seu próprio esquema de repetição.
Design para idempotência
A ocorrência de erros quando está a processar dados pode ser um problema para as suas funções, especialmente quando está a processar mensagens. É importante considerar o que acontece quando o erro ocorre e como evitar o processamento duplicado. Para saber mais, veja Criar Funções do Azure para entradas idênticas.
Tentativas
Existem dois tipos de repetições disponíveis para as suas funções:
- Comportamentos de repetição incorporados de extensões de acionador individuais
- Políticas de repetição fornecidas pelo runtime das Funções
A tabela seguinte indica que acionadores suportam repetições e onde o comportamento de repetição está configurado. Também liga a mais informações sobre erros provenientes dos serviços subjacentes.
Acionador/enlace | Repetir origem | Configuração |
---|---|---|
Azure Cosmos DB | Políticas de repetição | Nível da função |
Armazenamento de Blobs do Azure | Extensão de enlace | host.json |
Azure Event Grid | Extensão de enlace | Subscrição de eventos |
Azure Event Hubs | Políticas de repetição | Nível da função |
Armazenamento de Filas do Azure | Extensão de enlace | host.json |
RabbitMQ | Extensão de enlace | Fila de mensagens não entregues |
Service Bus do Azure | Extensão de enlace | Fila de mensagens não entregues |
Temporizador | Políticas de repetição | Nível da função |
Kafka | Políticas de repetição | Nível da função |
Políticas de repetição
A partir da versão 3.x do runtime de Funções do Azure, pode definir políticas de repetição para acionadores de Temporizador, Kafka e Hubs de Eventos que são impostos pelo runtime das Funções.
A política de repetição indica ao runtime para executar novamente uma execução falhada até ocorrer uma conclusão com êxito ou o número máximo de repetições ser atingido.
Uma política de repetição é avaliada quando uma função acionada pelo Temporizador, Kafka ou Hubs de Eventos gera uma exceção não identificada. Como melhor prática, deve detetar todas as exceções no seu código e voltar a gerar quaisquer erros que pretenda que resultem numa repetição.
Importante
Os pontos de verificação dos Hubs de Eventos não serão escritos até que a política de repetição da execução esteja concluída. Devido a este comportamento, o progresso na partição específica é colocado em pausa até que o lote atual seja concluído.
A extensão dos Hubs de Eventos v5 suporta capacidades de repetição adicionais para interações entre o anfitrião das Funções e o hub de eventos. Veja a clientRetryOptions
secção Hubs de Eventos do ficheiro host.json para obter mais informações.
Estratégias de repetição
Pode configurar duas estratégias de repetição que são suportadas pela política:
É permitido decorrido um período de tempo especificado entre cada repetição.
Contagem máxima de repetições
Pode configurar o número máximo de vezes que uma execução de função é repetida antes de uma eventual falha. A contagem de repetições atual é armazenada na memória da instância.
É possível que uma instância tenha uma falha entre tentativas de repetição. Quando uma instância falha durante uma política de repetição, a contagem de repetições é perdida. Quando existem falhas de instâncias, o acionador dos Hubs de Eventos consegue retomar o processamento e repetir o lote numa nova instância, com a reposição da contagem de repetições para zero. O acionador de temporizador não é retomado numa nova instância.
Este comportamento significa que a contagem máxima de repetições é o melhor esforço. Em alguns casos raros, uma execução pode ser repetida mais do que o número máximo de vezes pedido. Para os acionadores de Temporizador, as repetições podem ser inferiores ao número máximo pedido.
Exemplos de repetição
As repetições requerem o pacote NuGet Microsoft.Azure.WebJobs>= 3.0.23
[FunctionName("EventHubTrigger")]
[FixedDelayRetry(5, "00:00:10")]
public static async Task Run([EventHubTrigger("myHub", Connection = "EventHubConnection")] EventData[] events, ILogger log)
{
// ...
}
Propriedade | Descrição |
---|---|
MaxRetryCount | Obrigatório. O número máximo de repetições permitidas por execução de funções. -1 significa tentar novamente indefinidamente. |
DelayInterval | O atraso que é utilizado entre repetições. Especifique-a como uma cadeia com o formato HH:mm:ss . |
Eis a política de repetição no ficheiro function.json :
{
"disabled": false,
"bindings": [
{
....
}
],
"retry": {
"strategy": "fixedDelay",
"maxRetryCount": 4,
"delayInterval": "00:00:10"
}
}
propriedade function.json | Descrição |
---|---|
estratégia | Obrigatório. A estratégia de repetição a utilizar. Os valores válidos são fixedDelay ou exponentialBackoff . |
maxRetryCount | Obrigatório. O número máximo de repetições permitidas por execução de funções. -1 significa tentar novamente indefinidamente. |
delayInterval | O atraso que é utilizado entre repetições quando está a utilizar uma fixedDelay estratégia. Especifique-a como uma cadeia com o formato HH:mm:ss . |
minimumInterval | O atraso mínimo de repetição quando está a utilizar uma exponentialBackoff estratégia. Especifique-a como uma cadeia com o formato HH:mm:ss . |
maximumInterval | O atraso máximo de repetição quando estiver a utilizar exponentialBackoff a estratégia. Especifique-a como uma cadeia com o formato HH:mm:ss . |
Eis um exemplo de Python que utiliza o contexto de repetição numa função:
import azure.functions
import logging
def main(mytimer: azure.functions.TimerRequest, context: azure.functions.Context) -> None:
logging.info(f'Current retry count: {context.retry_context.retry_count}')
if context.retry_context.retry_count == context.retry_context.max_retry_count:
logging.warn(
f"Max retries of {context.retry_context.max_retry_count} for "
f"function {context.function_name} has been reached")
@FunctionName("TimerTriggerJava1")
@FixedDelayRetry(maxRetryCount = 4, delayInterval = "00:00:10")
public void run(
@TimerTrigger(name = "timerInfo", schedule = "0 */5 * * * *") String timerInfo,
final ExecutionContext context
) {
context.getLogger().info("Java Timer trigger function executed at: " + LocalDateTime.now());
}
Códigos de erro de enlace
Quando está a integrar com os serviços do Azure, os erros podem ter origem nas APIs dos serviços subjacentes. As informações relacionadas com erros específicos do enlace estão disponíveis nas secções "Exceções e códigos de retorno" dos seguintes artigos:
- BD do Cosmos para o Azure
- Armazenamento de Blobs
- Event Grid
- Hubs de Eventos
- Hub IoT
- Hubs de Notificação
- Armazenamento de Filas
- Service Bus
- Armazenamento de Tabelas