Abilita i nuovi tentativi delle funzioni basate su eventi
Questo documento descrive come abilitare i nuovi tentativi per le funzioni basate su eventi. Il nuovo tentativo automatico non è disponibile per le funzioni HTTP.
Semantica del nuovo tentativo
Cloud Functions garantisce l'esecuzione almeno una volta di una funzione basata su eventi per ogni evento emesso da un'origine evento. Per impostazione predefinita, se una chiamata a una funzione termina con un errore, la funzione non viene richiamata di nuovo e l'evento viene eliminato. Quando abiliti i nuovi tentativi su una funzione basata su eventi, Cloud Functions esegue un nuovo tentativo di chiamata di una funzione non riuscita finché non viene completata correttamente o fino alla scadenza del periodo per i nuovi tentativi.
Per le funzioni di 2ª generazione, il periodo per i nuovi tentativi scade dopo 24 ore. Per le funzioni di 1ª generazione, scade dopo 7 giorni. Cloud Functions esegue un nuovo tentativo delle funzioni basate su eventi appena create utilizzando una strategia di backoff esponenziale, con un backoff crescente compreso tra 10 e 600 secondi. Questo criterio viene applicato alle nuove funzioni la prima volta che ne esegui il deployment. Non viene applicata in modo retroattivo alle funzioni esistenti di cui è stato eseguito il deployment prima dell'applicazione delle modifiche descritte in questa nota di rilascio, anche se esegui nuovamente il deployment delle funzioni.
Quando i nuovi tentativi non sono abilitati per una funzione (impostazione predefinita), la funzione segnala sempre che è stata eseguita correttamente e nei suoi log potrebbero essere visualizzati i codici di risposta 200 OK
. Ciò si verifica anche se la funzione ha riscontrato un errore. Per chiarire quando la funzione rileva un errore, assicurati di segnalare gli errori in modo appropriato.
Perché le funzioni basate su eventi non vengono completate
In rare occasioni, una funzione potrebbe uscire prematuramente a causa di un errore interno e per impostazione predefinita potrebbe essere o meno eseguito un nuovo tentativo automatico della funzione.
Più in genere, una funzione basata su eventi potrebbe non essere completata correttamente a causa di errori generati nel codice della funzione stesso. Ecco alcuni dei possibili motivi:
- La funzione contiene un bug e il runtime genera un'eccezione.
- La funzione non può 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
null
a un callback.
In uno dei casi precedenti, la funzione interrompe l'esecuzione per impostazione predefinita e l'evento viene ignorato. Per riprovare a utilizzare la funzione quando si verifica un errore, puoi modificare il criterio predefinito per nuovi tentativi impostando la proprietà "Riprova in caso di errore". In questo modo l'evento viene ripetuto più volte fino al completamento della funzione o fino alla scadenza del timeout per i nuovi tentativi.
Attivare o disattivare i nuovi tentativi
Per abilitare o disabilitare i nuovi tentativi, puoi utilizzare lo strumento a riga di comando gcloud
o la console Google Cloud. I nuovi tentativi sono disattivati per impostazione predefinita.
Configurare i nuovi tentativi dallo strumento a riga di comando gcloud
Per abilitare i nuovi tentativi tramite lo strumento a riga di comando gcloud
, includi il flag --retry
durante il deployment della funzione:
gcloud functions deploy FUNCTION_NAME --retry FLAGS...
Per disabilitare i nuovi tentativi, esegui nuovamente il deployment della funzione senza il flag --retry
:
gcloud functions deploy FUNCTION_NAME FLAGS...
Configurare i nuovi tentativi dalla console Google Cloud
Se stai creando una nuova funzione:
- Nella schermata Crea funzione, seleziona Aggiungi trigger e scegli il tipo di evento da attivare per la funzione.
- Nel riquadro Trigger Eventarc, seleziona la casella di controllo Riprova in caso di errore per abilitare i nuovi tentativi.
Se stai aggiornando una funzione esistente:
- Nella pagina Panoramica di Cloud Functions, fai clic sul nome della funzione che stai aggiornando per aprire la schermata Dettagli funzione, quindi scegli Modifica dalla barra dei menu per visualizzare i riquadri dei trigger HTTPS ed Eventarc.
- Nel riquadro Trigger Eventarc, fai clic sull'icona di modifica per modificare le impostazioni del trigger.
- Nel riquadro Trigger Eventarc, seleziona o deseleziona la casella di controllo Riprova in caso di errore per abilitare o disabilitare i nuovi tentativi.
best practice
In questa sezione vengono descritte le best practice per l'utilizzo dei nuovi tentativi.
Usa Riprova per gestire gli errori temporanei
Poiché la funzione viene ripetuta continuamente fino all'esecuzione corretta, gli errori permanenti come i bug devono essere eliminati dal codice tramite test prima di abilitare i nuovi tentativi. I nuovi tentativi sono ideali per gestire gli errori intermittenti/temporanei con un'alta probabilità di risoluzione al momento dei nuovi tentativi, ad esempio un endpoint di servizio instabile o un timeout.
Imposta una condizione di fine per evitare cicli infiniti di nuovi tentativi
Una best practice consiste nel proteggere la funzione dal loop continuo quando utilizzi i nuovi 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 consiste nell'eliminare gli eventi con timestamp che risalgono a più di una certa data. Ciò consente di evitare esecuzioni eccessive quando gli errori sono permanenti o di durata maggiore del previsto.
Ad esempio, questo snippet di codice ignora tutti gli eventi più vecchi di 10 secondi:
Node.js
Python
Go
Java
C#
Ruby
PHP
Distinguere tra errori irreversibili ed errori irreversibili
Se per la funzione sono stati attivati nuovi tentativi, qualsiasi errore non gestito attiverà un nuovo tentativo. Assicurati che il codice acquisisca tutti gli errori che non dovrebbero comportare un nuovo tentativo.
Node.js
Python
Go
Java
C#
Ruby
PHP
Rendi le funzioni basate su eventi non ripetibili idempotenti
Le funzioni basate su eventi che possono essere riprovate devono essere idempotenti. Di seguito sono riportate alcune linee guida generali per rendere questa funzione idempotente:
- Molte API esterne (come Stripe) 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'idempotency funziona bene con la consegna "at-least-once", perché consente di riprovare in sicurezza. Una best practice generale per scrivere codice affidabile è combinare l'idempotenza con i nuovi tentativi.
- Assicurati che il codice sia internamente idempotente. Ad esempio:
- Assicurati che le mutazioni possano verificarsi più di una volta senza cambiare i risultati.
- Esegui una query sullo stato del database in una transazione prima di modificarne lo stato.
- Assicurati che tutti gli effetti collaterali siano idempotenti.
- Imporre un controllo transazionale all'esterno della funzione, indipendentemente dal codice. Ad esempio, lo stato permanente da qualche parte registra che un determinato ID evento è già stato elaborato.
- Gestisci le chiamate di funzione duplicate fuori banda. Ad esempio, avere un processo separato per la pulizia dopo chiamate di funzioni duplicate.
Configura il criterio per i nuovi tentativi
A seconda delle esigenze della Cloud Function, puoi configurare direttamente il criterio di nuovo tentativo. Questo ti consente di configurare una qualsiasi combinazione di quanto segue:
- Ridurre il periodo di prova da 7 giorni a un minimo di 10 minuti.
- Modifica il tempo minimo e massimo di backoff per la strategia di nuovo tentativo di backoff esponenziale.
- Modifica la strategia per i nuovi tentativi per riprovare immediatamente.
- Configura un argomento messaggi non recapitabili.
- Imposta un numero massimo e minimo di tentativi di consegna.
Per configurare il criterio per i nuovi tentativi:
- Scrivi una funzione HTTP.
- Utilizza l'API Pub/Sub per creare una sottoscrizione Pub/Sub, specificando l'URL della funzione come destinazione.
Per ulteriori informazioni sulla configurazione diretta di Pub/Sub, consulta la documentazione di Pub/Sub sulla gestione degli errori.
Passaggi successivi
- Deployment di Cloud Functions.
- Chiamata alle funzioni di trigger Cloud Pub/Sub.
- Chiamata alle funzioni trigger di Cloud Storage.
- Tutorial su Cloud Functions con Cloud Pub/Sub.
- Tutorial su Cloud Functions con Cloud Storage.