Questo documento descrive come attivare i tentativi per le funzioni Cloud Run basate su eventi. I nuovi tentativi automatici non sono disponibili per le funzioni HTTP.
Perché le funzioni basate su eventi non vengono completate
In rari casi, una funzione potrebbe terminare prematuramente a causa di un errore interno e, per impostazione predefinita, il tentativo potrebbe essere ripetuto o meno automaticamente.
In genere, una funzione basata su eventi potrebbe non essere completata correttamente a causa di errori generati nel codice della funzione stessa. 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 di farlo.
- La funzione genera intenzionalmente un'eccezione (ad esempio, quando la convalida di un parametro non va a buon fine).
- Una funzione Node.js restituisce una promessa rifiutata o passa un valore non
null
a un callback.
In uno qualsiasi dei casi precedenti, la funzione interromperà l'esecuzione e restituirà un errore. I trigger di eventi che producono i messaggi hanno criteri di ripetizione che puoi personalizzare per soddisfare le esigenze della tua funzione.
Semantica del nuovo tentativo
Cloud Run Functions fornisce l'esecuzione almeno una volta di una funzione basata su eventi per ogni evento emesso da un'origine eventi. Il modo in cui configuri i tentativi dipende da come hai creato la funzione:
- Le funzioni create nella consoleGoogle Cloud o con l'API Cloud Run Admin richiedono la creazione e la gestione separata dei trigger di eventi. I trigger hanno comportamenti di ripetizione predefiniti che puoi personalizzare in base alle esigenze della tua funzione.
- Le funzioni create con l'API Cloud Functions v2 creeranno implicitamente i trigger di eventi necessari, ad esempio argomenti Pub/Sub o trigger Eventarc. Per impostazione predefinita, i tentativi vengono disattivati per questi trigger e possono essere riattivati utilizzando l'API Cloud Functions v2.
Funzioni basate su eventi create con Cloud Run
Le funzioni create nella console Google Cloud o con l'API Cloud Run Admin richiedono la creazione e la gestione separate dei trigger di eventi. Ti consigliamo vivamente di esaminare il comportamento predefinito di ogni tipo di trigger:
- I criteri di ripetizione di Eventarc prevedono una conservazione predefinita dei messaggi di 24 ore con un ritardo di backoff esponenziale. Consulta la documentazione di Eventarc sugli eventi di ripetizione.
- Per impostazione predefinita, Pub/Sub utilizza il criterio di riconsegna immediata per tutte le sottoscrizioni. Consulta la documentazione di Pub/Sub sulla gestione degli errori relativi ai messaggi e sulle richieste di ripetizione.
Funzioni basate sugli eventi create con l'API Cloud Functions v2
Le funzioni create utilizzando l'API Cloud Functions v2, ad esempio utilizzando gcloud CLI, l'API REST o Terraform, creeranno e gestiranno i trigger di eventi per tuo conto. Per impostazione predefinita, se una chiamata di funzione termina con un errore, la funzione non viene richiamata di nuovo e l'evento viene eliminato. Quando abiliti i tentativi sulla funzione basata su eventi, Cloud Run Functions ritenta l'invocazione della funzione non riuscita finché non viene completata correttamente o la finestra di tentativi scade.
Quando i tentativi non sono attivati per una funzione, ovvero l'impostazione predefinita, la funzione
segnala sempre che è stata eseguita correttamente e nei log potrebbero
essere visualizzati codici di risposta 200 OK
. Ciò si verifica anche se la funzione ha riscontrato un errore. Per
rendere chiaro quando la tua funzione rileva un errore, assicurati di
segnalare gli errori
in modo appropriato.
Attivare o disattivare i tentativi
Per attivare o disattivare i tentativi, puoi utilizzare Google Cloud CLI. Per impostazione predefinita, i tentativi sono disattivati.
Configura i tentativi dalla Google Cloud CLI
Per abilitare i tentativi utilizzando Google Cloud CLI, includi il flag --retry
quando esegui il deployment della funzione:
gcloud functions deploy FUNCTION_NAME --retry FLAGS...
Per disattivare i tentativi, esegui nuovamente il deployment della funzione senza il flag --retry
:
gcloud functions deploy FUNCTION_NAME FLAGS...
Finestra di tentativi
Questo periodo di nuovi tentativi scade dopo 24 ore. Cloud Run functions esegue nuovi tentativi per le funzioni basate su eventi utilizzando una strategia di backoff esponenziale, con un backoff crescente compreso tra 10 e 600 secondi.Best practice
Questa sezione descrive le best practice per l'utilizzo dei tentativi.
Utilizzare i tentativi per gestire gli errori temporanei
Poiché la funzione viene ritentata continuamente fino all'esecuzione riuscita, gli errori permanenti come i bug devono essere eliminati dal codice tramite test prima di attivare i nuovi tentativi. I tentativi vengono utilizzati al meglio per gestire errori intermittenti o temporanei che hanno un'alta probabilità di risoluzione al 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
La best practice consiste nel proteggere la funzione da loop continui quando utilizzi i tentativi. Puoi farlo includendo una condizione di fine ben definita, prima che la funzione inizi l'elaborazione. Tieni presente che questa tecnica funziona solo se la funzione viene avviata correttamente ed è in grado di valutare la condizione finale.
Un approccio semplice ma efficace è quello di eliminare gli eventi con timestamp precedenti a un determinato periodo di tempo. In questo modo si evitano esecuzioni eccessive quando gli errori sono persistenti o di durata superiore al previsto.
Ad esempio, questo snippet di codice elimina tutti gli eventi più vecchi di 10 secondi:
Node.js
Python
Go
Java
C#
Ruby
PHP
Distinguere tra le funzioni che possono essere riprovate e gli errori irreversibili
Se i tentativi sono abilitati per la funzione, qualsiasi errore non gestito attiverà un nuovo tentativo. Assicurati che il codice acquisisca eventuali errori che non devono comportare un nuovo tentativo.
Node.js
Python
Go
Java
C#
Ruby
PHP
Rendere idempotenti le funzioni basate su eventi ripetibili
Le funzioni basate su eventi che possono essere riprovate devono essere idempotenti. Ecco alcune linee guida generali per rendere idempotente una funzione:
- Molte API esterne (come Stripe) ti consentono di fornire una chiave di idempotenza come parametro. Se utilizzi un'API di questo tipo, devi utilizzare l'ID evento come chiave di idempotenza.
- L'idempotenza funziona bene con la consegna "at-least-once", perché consente di riprovare in sicurezza. Pertanto, una best practice generale per scrivere codice affidabile è combinare l'idempotenza con i tentativi.
- Assicurati che il codice sia idempotente internamente. Ad esempio:
- Assicurati che le mutazioni possano verificarsi più di una volta senza modificare il risultato.
- Esegui query sullo stato del database in una transazione prima di modificarlo.
- Assicurati che tutti gli effetti collaterali siano idempotenti.
- Imponi un controllo transazionale al di fuori della funzione, indipendentemente dal codice. Ad esempio, mantieni lo stato in un punto in cui viene registrato che un determinato ID evento è già stato elaborato.
- Gestisci le chiamate di funzione duplicate fuori banda. Ad esempio, esegui una pulizia separata dopo le chiamate di funzioni duplicate.
Configura il criterio per i tentativi ripetuti
A seconda delle esigenze della tua funzione Cloud Run, potresti voler configurare direttamente la policy di riprova. In questo modo potrai configurare qualsiasi combinazione dei seguenti elementi:
- Ridurre la finestra di nuovi tentativi da 7 giorni a un minimo di 10 minuti.
- Modifica il tempo di backoff minimo e massimo per la strategia di ripetizione di 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 i criteri di ripetizione:
- Scrivi una funzione HTTP.
- Utilizza l'API Pub/Sub per creare un abbonamento Pub/Sub, specificando l'URL della funzione come target.
Per ulteriori informazioni sulla configurazione diretta di Pub/Sub, consulta la documentazione di Pub/Sub sulla gestione degli errori.
Passaggi successivi
- Esegui il deployment di Cloud Run Functions
- Chiamare le funzioni di trigger Pub/Sub
- Chiama le funzioni di attivazione di Cloud Storage
- Tutorial su Cloud Run Functions con Pub/Sub
- Tutorial su Cloud Run Functions con Cloud Storage