In diesem Dokument wird die Aktivierung von Wiederholungsversuchen für ereignisgesteuerte Funktionen (Hintergrundfunktionen und CloudEvent-Funktionen) beschrieben. Für HTTP-Funktionen sind keine automatischen Wiederholungsversuche verfügbar.
Semantik von Wiederholungsversuchen
Cloud Functions garantiert die mindestens einmalige Ausführung einer ereignisgesteuerten Funktion für jedes Ereignis, das von einer Ereignisquelle ausgegeben wird. Wenn ein Funktionsaufruf jedoch mit einem Fehler endet, wird die Funktion standardmäßig nicht noch einmal aufgerufen und das Ereignis wird verworfen. Wenn Sie Wiederholungsversuche für eine ereignisgesteuerte Funktion aktivieren, wiederholt Cloud Functions einen fehlgeschlagenen Funktionsaufruf, bis der Vorgang erfolgreich abgeschlossen ist oder der Wiederholungszeitraum abläuft (standardmäßig 7 Tage).
Warum ereignisgesteuerte Funktionen nicht abgeschlossen werden
In seltenen Fällen kann eine Funktion aufgrund eines internen Fehlers vorzeitig beendet werden. Je nach angegebener Standardeinstellung für diese Funktion werden dann Wiederholungsversuche mit der Funktion durchgeführt oder nicht.
Typischer ist das Fehlschlagen einer ereignisgesteuerten Funktion aufgrund von Fehlern, die im Funktionscode selbst ausgegeben werden. Hier sind einige mögliche Ursachen dafür:
- Die Funktion enthält einen Fehler und die Laufzeit löst eine Ausnahme aus
- Die Funktion kann einen Dienstendpunkt nicht erreichen oder überschreitet beim Versuch, den Endpunkt zu erreichen, das Zeitlimit.
- Die Funktion löst absichtlich eine Ausnahme aus (z. B. wenn die Validierung eines Parameters fehlschlägt).
- In Node.js geschriebene Funktionen geben ein abgelehntes Versprechen zurück oder leiten einen Nicht-
null
-Wert an einen Callback weiter.
In allen obigen Fällen wird die Ausführung der Funktion standardmäßig gestoppt und das Ereignis wird verworfen. Wenn Sie beim Auftreten eines Fehlers eine Funktion erneut versuchen möchten, können Sie die Standardrichtlinie für Wiederholungsversuche ändern, indem Sie das Attribut "Bei Fehler noch einmal versuchen" festlegen. Dadurch werden für das Ereignis Wiederholungsversuche durchgeführt (bis hin zu mehreren Tagen), bis die Funktion erfolgreich abgeschlossen wird.
Wiederholungsversuche aktivieren oder deaktivieren
Zum Aktivieren oder Deaktivieren von Wiederholungsversuchen können Sie entweder das gcloud
-Befehlszeilentool oder die Cloud Console verwenden. Standardmäßig sind Wiederholungsversuche deaktiviert.
gcloud
-Befehlszeilentool verwenden
Fügen Sie zum Aktivieren von Wiederholungsversuchen über das gcloud
-Befehlszeilentool beim Bereitstellen der Funktion das Flag --retry
ein:
gcloud functions deploy FUNCTION_NAME --retry FLAGS...
Stellen Sie zum Deaktivieren von Wiederholungsversuchen die Funktion ohne das Flag --retry
noch einmal bereit:
gcloud functions deploy FUNCTION_NAME FLAGS...
Cloud Console verwenden
In der Cloud Console können Sie Wiederholungsversuche so aktivieren bzw. deaktivieren:
Rufen Sie die Seite „Cloud Functions – Übersicht“ in der Cloud Platform Console auf.
Klicken Sie auf Funktion erstellen. Klicken Sie alternativ auf eine vorhandene Funktion, um deren Detailseite aufzurufen, und klicken dann auf Bearbeiten.
Füllen Sie die erforderlichen Felder für die Funktion aus.
Legen Sie für das Feld Trigger einen ereignisbasierten Triggertyp wie Cloud Pub/Sub oder Cloud Storage fest.
Maximieren Sie die erweiterten Einstellungen durch Klicken auf Mehr.
Aktivieren oder deaktivieren Sie das Kästchen Bei Fehler noch einmal versuchen.
Best Practices
In diesem Abschnitt werden Best Practices für den Einsatz von Wiederholungsversuchen beschrieben.
Wiederholungsversuche zur Behebung vorübergehender Fehler verwenden
Da Ihre Funktion bis zur erfolgreichen Ausführung kontinuierlich wiederholt wird, sollten Sie vor dem Aktivieren von Wiederholungsversuchen permanente Fehler wie Programmfehler mithilfe von Tests im Code beseitigen. Wiederholungsversuche sollten am besten für unregelmäßige/vorübergehende Fehler verwendet werden, bei denen die Wahrscheinlichkeit einer Behebung bei einem erneuten Versuch hoch ist, z. B. bei unzuverlässigen Dienstendpunkten oder Zeitüberschreitungen.
Endbedingung festlegen, um Endlosschleifen zu verhindern
Beim Einsatz von Wiederholungsversuchen ist es eine Best Practice, die Funktion vor Endlosschleifen zu schützen. Dies erreichen Sie beispielsweise, indem Sie eine gut definierte Endbedingung einfügen, bevor die Verarbeitung der Funktion beginnt. Beachten Sie, dass diese Methode nur funktioniert, wenn Ihre Funktion erfolgreich gestartet wird und die Endbedingung auswerten kann.
Ein einfacher, aber effektiver Ansatz ist, Ereignisse zu verwerfen, deren Zeitstempel älter als ein bestimmtes Datum ist. Dadurch werden übermäßig viele Ausführungen verhindert, wenn Fehler entweder persistent oder langlebiger als erwartet sind.
Beispielsweise werden durch dieses Code-Snippet alle Ereignisse verworfen, die älter als 10 Sekunden sind:
Node.js
Python
Go
Java
C#
Ruby
Zwischen wiederholbaren und schwerwiegenden Fehlern unterscheiden
Wenn für Ihre Funktion Wiederholungsversuche aktiviert sind, löst jeder nicht aufgelöste Fehler einen Wiederholungsversuch aus. Achten Sie darauf, dass in Ihrem Code keine Fehler mehr enthalten sind, für die keine Wiederholungsversuche ausgelöst werden sollten.
Node.js
Python
Go
Java
C#
Ruby
Wiederholbare ereignisgesteuerte Funktionen idempotent machen
Ereignisgesteuerte Funktionen, für die Wiederholungsversuche gemacht werden können, müssen idempotent sein. Hier sind einige allgemeine Richtlinien, wie Sie eine solche Funktion idempotent machen:
- Bei vielen externen APIs (z. B. Stripe) können Sie einen Idempotenzschlüssel als Parameter bereitstellen. Wenn Sie eine solche API verwenden, sollten Sie die Ereignis-ID als Idempotenzschlüssel verwenden.
- Idempotenz funktioniert gut bei mindestens einmaliger Übermittlung, weil Wiederholungsversuche dadurch problemlos erfolgen können. Eine allgemeine Best Practice für das Schreiben von zuverlässigem Code ist also, Idempotenz mit Wiederholungsversuchen zu kombinieren.
- Achten Sie darauf, dass der Code intern idempotent ist. Beispiele:
- Sorgen Sie dafür, dass Mutationen mehr als einmal passieren können, ohne das Ergebnis zu verändern.
- Fragen Sie den Datenbankstatus in einer Transaktion ab, bevor der Status mutiert wird.
- Stellen Sie sicher, dass alle Nebenwirkungen selbst idempotent sind.
- Erzwingen Sie eine Transaktionsprüfung außerhalb der Funktion und unabhängig vom Code. Beispiel: Zustand an einem Punkt persistent machen, um aufzuzeichnen, dass eine bestimmte Ereignis-ID bereits verarbeitet wurde.
- Nutzen Sie ein Verfahren für doppelte Funktionsaufrufe "out of band". Verwenden Sie beispielsweise einen separaten Bereinigungsprozess, der nach doppelten Funktionsaufrufen eine Bereinigung durchführt.
Weitere Informationen
- Cloud Functions bereitstellen
- Cloud Pub/Sub-Triggerfunktionen aufrufen
- Cloud Storage-Triggerfunktionen aufrufen
- Anleitung für Cloud Functions mit Cloud Pub/Sub
- Anleitung zu Cloud Functions mit Cloud Storage