Este documento descreve como configurar novas tentativas para funções do Cloud Run orientadas a eventos.
Conforme descrito em Eventos de nova tentativa, quando um destino de mensagem do Pub/Sub não consegue confirmar uma mensagem, a resposta padrão do Pub/Sub é enviar a mensagem novamente com um atraso de espera exponencial. Uma espera exponencial permite adicionar atrasos cada vez mais longos entre as novas tentativas. No entanto, esse pode não ser o comportamento desejado para sua implementação específica.
A propriedade de novas tentativas não é implementada na função em si, mas no gatilho do Eventarc que invoca a função, o que oferece mais flexibilidade. Isso significa que, para destinos do Cloud Run (incluindo funções do Cloud Run criadas com a API Cloud Run Admin ou a API v2 do Cloud Functions), é possível configurar uma única tentativa de entrega sem novas tentativas. Essa é a configuração padrão ao criar um gatilho do Eventarc no Google Cloud console na página do Cloud Run. Para mais informações, consulte Criar gatilhos com o Eventarc.
Por que as funções baseadas em eventos não são concluídas?
Uma função orientada a eventos pode não ser concluída com sucesso devido a erros gerados no próprio código da função. Os motivos para isso incluem:
- A função contém um bug e o ambiente de execução gera uma exceção.
- A função não consegue acessar um endpoint de serviço ou expira durante a tentativa.
- A função gera uma exceção intencionalmente (por exemplo, quando há falha na validação de um parâmetro).
- Uma função Node.js retorna uma promessa rejeitada ou transmite um valor diferente de
nullpara uma chamada de retorno. - Em raras ocasiões, uma função pode ser encerrada prematuramente devido a um erro interno e, por padrão, ela pode ser repetida automaticamente ou não.
Em qualquer um desses casos, a função vai parar de ser executada e retornar um erro. Os acionadores de eventos que produzem as mensagens têm políticas de repetição que podem ser personalizadas para atender às necessidades da função.
Configurar a política de repetição
Dependendo das necessidades da função do Cloud Run, é possível configurar a política de repetição pela política de repetição de assinatura do Pub/Sub associada ao gatilho do Eventarc. Isso permite que você configure qualquer combinação dos itens a seguir:
- reduzir a janela de novas tentativas de 7 dias para 10 minutos.
- alterar os tempos mínimo e máximo de espera da estratégia de nova tentativa com espera exponencial.
- alterar a estratégia de nova tentativa para tentar de novo imediatamente.
- configurar um tópico de mensagens inativas.
- definir um número máximo e mínimo de tentativas de entrega.
Para configurar a política de repetição:
- Escreva uma função HTTP.
- Use a API Pub/Sub para criar uma assinatura do Pub/Sub, especificando o URL da função como destino.
Consulte a documentação do Eventarc sobre como repetir eventos para outras práticas recomendadas, como tornar idempotentes as funções orientadas a eventos que podem ser repetidas.
Consulte a documentação do Pub/Sub sobre como lidar com falhas para mais informações sobre como configurar o Pub/Sub diretamente.
Práticas recomendadas
Nesta seção, você verá as práticas recomendadas para o uso de novas tentativas.
Usar novas tentativas para lidar com erros transitórios
Como novas tentativas de executar a função são realizadas continuamente até a conclusão bem-sucedida, erros permanentes, como bugs, devem ser eliminados do código por meio de teste detalhado antes de ativá-las. As tentativas funcionam melhor para lidar com falhas intermitentes ou transitórias que têm alta probabilidade de serem solucionadas ao tentar novamente, como um endpoint de serviço ou tempo limite lentos.
Definir uma condição final para evitar loops infinitos de tentativas
A prática recomendada ao usar tentativas é proteger a função contra loop contínuo. Para isso, inclua uma condição final bem definida antes de a função iniciar o processamento. Essa técnica só funciona se sua função for iniciada com sucesso e puder avaliar a condição final.
Uma abordagem eficaz é descartar eventos com carimbos de data/hora anteriores a um determinado momento. Isso ajuda a evitar o excesso de execuções quando as falhas são persistentes ou mais duradouras do que o esperado.
Por exemplo, este snippet de código descarta todos os eventos ocorridos há mais de 10 segundos:
Node.js
Python
Go
Java
C#
Ruby
PHP
Distinguir entre funções que podem ser tentadas novamente e erros fatais
Se a função tiver novas tentativas ativadas, qualquer erro não processado acionará uma nova tentativa. Verifique se o código captura todos os erros que não precisam resultar em uma nova tentativa.
Node.js
Python
Go
Java
C#
Ruby
PHP
Próximas etapas
- Implantar uma função do Cloud Run
- Criar gatilhos de eventos do Pub/Sub
- Criar gatilhos de eventos do Cloud Storage
- Acionar funções do Pub/Sub usando o Eventarc
- Acionar funções do Cloud Storage usando Eventarc