Este documento descreve como ativar as novas tentativas para funções do Cloud Run baseadas em eventos. As novas tentativas automáticas não estão disponíveis para funções HTTP.
Por que motivo as funções acionadas por eventos não são concluídas
Em raras ocasiões, uma função pode terminar prematuramente devido a um erro interno e, por predefinição, a função pode ou não ser repetida automaticamente.
Normalmente, uma função acionada por eventos pode não ser concluída com êxito devido a erros gerados no próprio código da função. Os motivos pelos quais isto pode acontecer incluem:
- A função contém um erro e o tempo de execução gera uma exceção.
- A função não consegue alcançar um ponto final de serviço ou excede o tempo limite ao tentar fazê-lo.
- A função gera intencionalmente uma exceção (por exemplo, quando um parâmetro falha a validação).
- Uma função Node.js devolve uma promessa rejeitada ou passa um valor não-
null
para um retorno.
Em qualquer um dos casos acima, a função deixa de ser executada e devolve um erro. Os acionadores de eventos que produzem as mensagens têm políticas de repetição que pode personalizar para satisfazer as necessidades da sua função.
Semântica da nova tentativa
As funções do Cloud Run oferecem uma execução, pelo menos, uma vez de uma função orientada por eventos para cada evento emitido por uma origem de eventos. A forma como configura as novas tentativas depende de como criou a função:
- As funções criadas na Google Cloud consola ou com a API Cloud Run Admin exigem que crie e faça a gestão dos acionadores de eventos separadamente. Os acionadores têm comportamentos de repetição predefinidos que pode personalizar de acordo com as necessidades da sua função.
- As funções criadas com a API Cloud Functions v2 criam implicitamente os acionadores de eventos necessários, por exemplo, tópicos do Pub/Sub ou acionadores do Eventarc. Por predefinição, as novas tentativas estão desativadas para estes acionadores e podem ser reativadas através da API Cloud Functions v2.
Funções orientadas por eventos criadas com o Cloud Run
As funções criadas na Google Cloud consola ou com a API Cloud Run Admin requerem que crie e faça a gestão dos acionadores de eventos separadamente. Recomendamos vivamente que reveja o comportamento predefinido de cada tipo de acionador:
- A política de repetição do Eventarc tem uma retenção de mensagens predefinida de 24 horas com um atraso de retirada exponencial. Consulte a documentação do Eventarc sobre eventos de repetição.
- O Pub/Sub usa a política de reenvio imediato por predefinição para todas as subscrições. Consulte a documentação do Pub/Sub sobre como lidar com falhas de mensagens e repetir pedidos.
Funções orientadas por eventos criadas com a Cloud Functions v2 API
As funções criadas através da API Cloud Functions v2; por exemplo, através da CLI gcloud do Cloud Functions, da API REST ou do Terraform, criam e gerem acionadores de eventos em seu nome. Por predefinição, se uma invocação de função terminar com um erro, a função não é invocada novamente e o evento é ignorado. Quando ativa as novas tentativas numa função acionada por eventos, as funções do Cloud Run repetem uma invocação de função com falha até ser concluída com êxito ou o período de novas tentativas expirar.
Quando as novas tentativas não estão ativadas para uma função, que é a predefinição, a função
comunica sempre que foi executada com êxito e os códigos de resposta 200 OK
podem
aparecer nos respetivos registos. Isto ocorre mesmo que a função tenha encontrado um erro. Para deixar claro quando a sua função encontra um erro, certifique-se de que comunica os erros adequadamente.
Ative ou desative as novas tentativas
Para ativar ou desativar as novas tentativas, pode usar a Google Cloud CLI. Por predefinição, as repetições estão desativadas.
Configure as novas tentativas a partir da CLI do Google Cloud
Para ativar as novas tentativas através da Google Cloud CLI, inclua a flag --retry
ao implementar a função:
gcloud functions deploy FUNCTION_NAME --retry FLAGS...
Para desativar as novas tentativas, volte a implementar a função sem a flag --retry
:
gcloud functions deploy FUNCTION_NAME FLAGS...
Período de nova tentativa
Esta janela de nova tentativa expira após 24 horas. As funções do Cloud Run repetem as funções acionadas por eventos recém-criadas através de uma estratégia de recuo exponencial, com um recuo crescente entre 10 e 600 segundos.Práticas recomendadas
Esta secção descreve as práticas recomendadas para usar novas tentativas.
Use a repetição para processar erros momentâneos
Uma vez que a sua função é repetida continuamente até à execução bem-sucedida, os erros permanentes, como erros de programação, devem ser eliminados do seu código através de testes antes de ativar as repetições. As novas tentativas são mais adequadas para lidar com falhas intermitentes ou transitórias que têm uma elevada probabilidade de resolução após uma nova tentativa, como um ponto final de serviço instável ou um limite de tempo.
Defina uma condição de fim para evitar ciclos de repetição infinitos
É uma prática recomendada proteger a sua função contra ciclos contínuos quando usa novas tentativas. Pode fazê-lo incluindo uma condição de fim bem definida antes de a função começar o processamento. Tenha em atenção que esta técnica só funciona se a função for iniciada com êxito e conseguir avaliar a condição final.
Uma abordagem simples, mas eficaz, consiste em rejeitar eventos com data/hora anteriores a um determinado período. Isto ajuda a evitar execuções excessivas quando as falhas são persistentes ou duram mais tempo do que o esperado.
Por exemplo, este fragmento do código rejeita todos os eventos com mais de 10 segundos:
Node.js
Python
Ir
Java
C#
Ruby
PHP
Distinguir entre funções que podem ser repetidas e erros fatais
Se a sua função tiver repetições ativadas, qualquer erro não processado aciona uma repetição. Certifique-se de que o seu código capta todos os erros que não devem resultar numa nova tentativa.
Node.js
Python
Ir
Java
C#
Ruby
PHP
Torne as funções acionadas por eventos repetíveis idempotentes
As funções acionadas por eventos que podem ser repetidas têm de ser idempotentes. Seguem-se algumas diretrizes gerais para tornar uma função deste tipo idempotente:
- Muitas APIs externas (como a Stripe) permitem fornecer uma chave de idempotência como um parâmetro. Se estiver a usar uma API deste tipo, deve usar o ID do evento como chave de idempotência.
- A idempotência funciona bem com o fornecimento pelo menos uma vez, porque torna a repetição segura. Assim, uma prática recomendada geral para escrever código fiável é combinar a idempotência com as novas tentativas.
- Certifique-se de que o seu código é internamente idempotente. Por exemplo:
- Certifique-se de que as mutações podem ocorrer mais do que uma vez sem alterar o resultado.
- Consultar o estado da base de dados numa transação antes de alterar o estado.
- Certifique-se de que todos os efeitos secundários são idempotentes.
- Impor uma verificação transacional fora da função, independentemente do código. Por exemplo, manter o estado num local que registe que um determinado ID do evento já foi processado.
- Lidar com chamadas de funções duplicadas fora da banda. Por exemplo, ter um processo de limpeza separado que limpe após chamadas de funções duplicadas.
Configure a política de repetição
Consoante as necessidades da sua função do Cloud Run, pode querer configurar a política de repetição diretamente. Isto permite-lhe configurar qualquer combinação do seguinte:
- Reduzir o período de nova tentativa de 7 dias para apenas 10 minutos.
- Altere o tempo de recuo mínimo e máximo para a estratégia de repetição de recuo exponencial.
- Altere a estratégia de repetição para repetir imediatamente.
- Configure um tópico de mensagens não entregues.
- Defina um número máximo e mínimo de tentativas de entrega.
Para configurar a política de repetição:
- Escrever uma função HTTP.
- Use a API Pub/Sub para criar uma subscrição do Pub/Sub, especificando o URL da função como o destino.
Consulte a documentação do Pub/Sub sobre como processar falhas para obter mais informações sobre a configuração direta do Pub/Sub.
Passos seguintes
- Implemente funções do Cloud Run
- Chame funções de acionador do Pub/Sub
- Chame funções de acionador do Cloud Storage
- Funções do Cloud Run com tutorial do Pub/Sub
- Funções do Cloud Run com tutorial do Cloud Storage