Questo documento descrive come configurare la ripetizione dei tentativi per Cloud Run Functions basate su eventi.
Come descritto in Eventi di ripetizione, quando una destinazione di messaggi Pub/Sub non può riconoscere un messaggio, la risposta predefinita di Pub/Sub è di inviare nuovamente il messaggio con un ritardo di backoff esponenziale. Un backoff esponenziale ti consente di aggiungere ritardi progressivamente più lunghi tra i nuovi tentativi. Tuttavia, questo potrebbe non essere il comportamento che vuoi per la tua implementazione specifica.
La proprietà retries non viene implementata nella funzione stessa, ma nel trigger Eventarc che richiama la funzione, il che offre maggiore flessibilità. Ciò significa che per le destinazioni Cloud Run (incluse Cloud Run Functions create con l'API Cloud Run Admin o l'API Cloud Functions v2), puoi configurare un singolo tentativo di consegna senza ripetizioni. Questa è la configurazione predefinita quando crei un trigger Eventarc nella Google Cloud console dalla pagina Cloud Run. Per saperne di più, consulta Creare trigger con Eventarc.
Motivi per il mancato completamento delle funzioni basate su eventi
Una funzione basata su eventi potrebbe non essere completata correttamente a causa di errori generati nel codice stesso della funzione. I motivi per cui ciò potrebbe accadere includono:
- La funzione contiene un bug e il runtime genera un'eccezione.
- La funzione non riesce a raggiungere un endpoint di servizio o si verifica un timeout durante il tentativo.
- La funzione genera intenzionalmente un'eccezione (ad esempio, quando un parametro non supera la convalida).
- Una funzione Node.js restituisce una promessa rifiutata o passa un valore non
nulla un callback. - In rari casi, una funzione potrebbe terminare prematuramente a causa di un errore interno; per impostazione predefinita, il tentativo di eseguire la funzione può essere ripetuto automaticamente o meno.
In uno qualsiasi di questi casi, la funzione interrompe l'esecuzione e restituisce un errore. I trigger di eventi che producono i messaggi hanno policy di ripetizione che puoi personalizzare per soddisfare le esigenze della tua funzione.
Configura la policy di ripetizione dei tentativi
A seconda delle esigenze della tua Cloud Run Function, potresti voler configurare la policy di ripetizione tramite la policy di ripetizione della sottoscrizione Pub/Sub associata al trigger Eventarc. In questo modo potrai configurare qualsiasi combinazione dei seguenti elementi:
- Riduci la finestra di ripetizione da 7 giorni a un minimo di 10 minuti.
- Modifica il tempo di backoff minimo e massimo per la strategia di ripetizione con backoff esponenziale.
- Modifica la strategia di ripetizione per riprovare immediatamente.
- Configura un argomento messaggi non recapitabili.
- Imposta un numero massimo e minimo di tentativi di consegna.
Per configurare la policy di ripetizione:
- Scrivi una funzione HTTP.
- Utilizza l'API Pub/Sub per creare una sottoscrizione Pub/Sub, specificando l'URL della funzione come destinazione.
Consulta la documentazione di Eventarc sulla ripetizione degli eventi per altre best practice, ad esempio come rendere le funzioni basate su eventi che possono essere riprovate idempotenti.
Per saperne di più sulla configurazione diretta di Pub/Sub, consulta la documentazione di Pub/Sub sulla gestione degli errori.
Best practice
Questa sezione descrive le best practice per l'utilizzo della ripetizione dei tentativi.
Utilizza la ripetizione dei tentativi per gestire gli errori temporanei
Poiché l'esecuzione della funzione viene riprovata continuamente fino a che non riesce, gli errori permanenti come i bug devono essere eliminati dal codice tramite test prima di attivare la ripetizione dei tentativi. La ripetizione dei tentativi è ideale per gestire errori intermittenti o temporanei che hanno un'alta probabilità di essere risolti quando viene eseguito un nuovo tentativo, ad esempio un endpoint di servizio instabile o un timeout.
Imposta una condizione di fine per evitare loop di tentativi ripetuti all'infinito
Come best practice, proteggi la funzione da loop continui quando utilizzi la ripetizione dei tentativi. Per farlo, puoi includere una condizione di fine ben definita, prima che inizi l'elaborazione della funzione. Tieni presente che questa tecnica funziona solo se la funzione viene avviata correttamente ed è in grado di valutare la condizione di fine.
Un approccio efficace consiste nell'ignorare gli eventi con timestamp precedenti una determinata data e ora. In questo modo si evitano esecuzioni eccessive quando gli errori sono persistenti o di durata superiore al previsto.
Ad esempio, questo snippet di codice ignora tutti gli eventi più vecchi di 10 secondi:
Node.js
Python
Go
Java
C#
Ruby
PHP
Distingui tra le funzioni che possono essere riprovate e gli errori irreversibili
Se la ripetizione dei tentativi è abilitata per la tua funzione, qualsiasi errore non gestito attiverà un nuovo tentativo. Assicurati che nel codice siano previsti tutti gli errori che non devono comportare un nuovo tentativo.
Node.js
Python
Go
Java
C#
Ruby
PHP
Passaggi successivi
- Esegui il deployment di una Cloud Run Function
- Crea trigger da eventi Pub/Sub
- Crea trigger da eventi Cloud Storage
- Attiva funzioni da Pub/Sub utilizzando Eventarc
- Attiva funzioni da Cloud Storage utilizzando Eventarc