Exponentielles Backoff mit Jitter: Ein leistungsstarkes Tool für ausfallsichere Systeme

Apr 19 2023
In der heutigen Welt müssen Computersysteme zuverlässig sein. Da sich immer mehr Unternehmen auf Technologie verlassen, kann jede Ausfallzeit zu erheblichen finanziellen Verlusten führen.

In der heutigen Welt müssen Computersysteme zuverlässig sein. Da sich immer mehr Unternehmen auf Technologie verlassen, kann jede Ausfallzeit zu erheblichen finanziellen Verlusten führen. Aus diesem Grund müssen Entwickler sicherstellen, dass ihre Anwendungen unvermeidlichen Ausfällen in verteilten Systemen standhalten. Ein mächtiges Werkzeug in ihrem Arsenal ist Exponential Backoff mit Jitter.

Was ist exponentielles Backoff?

Exponential Backoff ist eine Technik, die es einer Anwendung ermöglicht, einen fehlgeschlagenen Vorgang zu wiederholen, wobei die Wartezeiten zwischen den Wiederholungen progressiv verlängert werden. Bei jedem Fehler erhöht die Anwendung die Wartezeit exponentiell, sodass das System sich von vorübergehenden Fehlern erholen kann, die das Problem verursachen könnten. Dieser Ansatz stellt sicher, dass die Anwendung das System nicht mit Wiederholungsversuchen überschwemmt und das Problem potenziell schwerwiegender macht.

Beispiel für exponentielles Backoff

Angenommen, Sie haben ein Skript, das einen API-Aufruf an einen Dienst sendet, der gelegentlich aufgrund von Netzwerkverbindungsproblemen oder Drosselung einen Fehler zurückgeben kann. Sie möchten eine Wiederholungsstrategie implementieren, die den API-Aufruf bis zu fünfmal mit zunehmender Verzögerungszeit wiederholt.

So implementieren Sie die Exponential Backoff-Strategie:

Exponentielles Backoff

Wie Sie sehen, beginnt die Verzögerungszeit bei einem Basiswert von 1,0 Sekunden und verdoppelt sich bei jedem Wiederholungsversuch. Dadurch erhält der Dienst genügend Zeit, um sich von dem Fehler zu erholen, und Wiederholungsstürme werden reduziert.

Die alleinige Verwendung dieser Strategie kann jedoch immer noch dazu führen, dass alle Wiederholungen gleichzeitig erfolgen, wodurch der Dienst möglicherweise überlastet und weitere Probleme verursacht werden. Hier kommt Exponential Backoff mit Jitter ins Spiel.

Was ist der exponentielle Backoff bei Jitter?

Exponentielles Backoff mit Jitter ist eine Technik, die zum Wiederholen fehlgeschlagener Vorgänge in verteilten Systemen verwendet wird. Dabei wird die Verzögerung zwischen den Wiederholungsversuchen allmählich erhöht, wobei klein begonnen und exponentiell anwächst, bis eine maximale Verzögerung erreicht ist. Dieser Ansatz reduziert die Systemlast und verhindert eine Überlastung durch übermäßige Wiederholungen.

Das Planen aller Wiederholungen zur gleichen Zeit kann jedoch immer noch Spitzen in der Systemlast und weitere Ausfälle verursachen. Um dies abzumildern, wird Jitter eingeführt, der eine zufällige Variation der Verzögerung zwischen Wiederholungsversuchen hinzufügt. Dies hilft bei der Verteilung von Wiederholungsversuchen und vermeidet Systemlastspitzen.

Die Verwendung von exponentiellem Backoff mit Jitter ist vorteilhaft für die Behandlung vorübergehender Fehler, wie z. B. Netzwerkfehler oder Dienstdrosselung. Es gibt dem System Zeit, sich zu erholen und die Probleme zu lösen. Darüber hinaus kann durch Reduzierung der Systemlast und Vermeidung von Jitter-Spitzen das Systemausfallrisiko minimiert werden.

Beispiel für exponentiellen Backoff mit Jitter

Mit Exponential Backoff with Jitter fügen Sie der Verzögerungszeit eine gewisse Zufälligkeit hinzu, indem Sie eine zufällige Verzögerung oder „Jitter“ in die nächste Wiederholungsverzögerungszeit einführen. Dadurch wird sichergestellt, dass die Wiederholungen nicht synchron sind, und die Wahrscheinlichkeit eines Wiederholungssturms wird verringert. So würde die Tabelle mit exponentiellem Backoff mit Jitter aussehen:

Exponentielles Backoff mit Jitter

Wie Sie sehen können, variiert die tatsächliche Verzögerungszeit aufgrund des eingeführten Jitters leicht. Dies verringert die Wahrscheinlichkeit gleichzeitiger Wiederholungsversuche und verhindert eine Überlastung des Dienstes.

Die Verwendung von exponentiellem Backoff mit Jitter kann Ihre Anwendung widerstandsfähiger und zuverlässiger machen, vorübergehende Fehler elegant handhaben und die Benutzererfahrung verbessern.

Implementieren von exponentiellem Backoff mit Jitter mit dem AWS S3-Service

Angenommen, Sie haben ein Python-Skript, das eine Datei mithilfe der Boto3-Bibliothek in einen S3-Bucket hochlädt. Manchmal kann der Upload aufgrund von Netzwerkproblemen oder anderen vorübergehenden Fehlern fehlschlagen. Sie möchten Exponential Backoff mit Jitter implementieren, um den Upload bei Fehlern erneut zu versuchen.

So ändern Sie das Skript, um exponentielles Backoff mit Jitter zu implementieren:

import boto3
import random
import time

# Create an S3 client
s3 = boto3.client('s3')

# Define the upload function with Exponential Backoff and Jitter
def upload_file_with_retry(bucket, key, filename, max_retries=5, base_delay=1.0, max_delay=60.0, jitter_range=0.5):
    retry_count = 0
    delay = base_delay
    while True:
        try:
            print(f'Uploading {filename} to s3://{bucket}/{key}')
            s3.upload_file(filename, bucket, key)
            print(f'Upload complete!')
            return True
        except Exception as e:
            print(f'Upload failed: {str(e)}')
            if retry_count >= max_retries:
                print(f'Retries exhausted. Aborting upload.')
                return False
            else:
                jitter = random.uniform(-jitter_range, jitter_range)
                delay *= 2
                delay = min(delay + jitter, max_delay)
                print(f'Retrying in {delay} seconds...')
                time.sleep(delay)
                retry_count += 1

# Call the upload function with retry
upload_file_with_retry('my-bucket', 'my-file.txt', '/path/to/my-file.txt')

  • Die Funktion upload_file_with_retry übernimmt den S3-Bucket-Namen, den Schlüssel (Dateipfad), den lokalen Dateinamen und optionale Parameter für Wiederholungseinstellungen.
  • Die Funktion hat eine While-Schleife, die die Datei so lange hochlädt, bis sie erfolgreich ist oder die maximale Anzahl von Wiederholungen erreicht ist.
  • Wenn ein Upload-Versuch fehlschlägt, gibt die Funktion eine Fehlermeldung aus und berechnet die nächste Wiederholungsverzögerung. Die Verzögerung beginnt mit der Basisverzögerung (in diesem Beispiel 1,0 Sekunden) und verdoppelt sich bei jedem erneuten Versuch, bis sie die maximale Verzögerung erreicht (in diesem Beispiel 60,0 Sekunden).
  • Um Jitter einzuführen, generiert die Funktion eine zufällige Float-Zahl zwischen dem negativen und positiven Jitter-Bereich (in diesem Beispiel 0,5 Sekunden) und fügt sie der nächsten Wiederholungsverzögerung hinzu. Dadurch wird sichergestellt, dass die tatsächliche Verzögerung geringfügig variiert, und die Wahrscheinlichkeit verringert, dass Wiederholungsversuche gleichzeitig erfolgen.
  • Die Funktion schläft für die berechnete Verzögerung vor dem nächsten Wiederholungsversuch.

Darüber hinaus kann die Implementierung von exponentiellem Backoff mit Jitter auch verhindern, dass Ihre Anwendung aufgrund übermäßiger Wiederholungen vom Dienst auf die schwarze Liste gesetzt wird. Viele Dienste verfügen über Ratenbegrenzungsmechanismen, um Missbrauch zu verhindern, und zu häufige und zu schnelle Wiederholungsversuche können diese Mechanismen auslösen und dazu führen, dass Ihre IP oder Ihr Konto vorübergehend gesperrt wird.

Durch die Verwendung von Exponential Backoff mit Jitter können Sie die Wahrscheinlichkeit minimieren, dass Sie diese Ratenlimits erreichen, und vermeiden, blockiert zu werden. Darüber hinaus können Sie fehlgeschlagene Anforderungen immer noch wiederholen und schließlich erfolgreich sein.

Zusammenfassend lässt sich sagen, dass Exponential Backoff with Jitter ein leistungsstarkes Tool zur Verbesserung der Zuverlässigkeit und Belastbarkeit Ihrer Anwendung bei API-Aufrufen oder der Kommunikation mit externen Diensten über das Netzwerk ist. Indem Sie Zufälligkeit in die Verzögerungszeit zwischen Wiederholungen einführen, können Sie synchrone Wiederholungen vermeiden. Dies verringert die Wahrscheinlichkeit, dass der Dienst überlastet wird oder Ratenbegrenzungsmechanismen ausgelöst werden. Und indem Sie die Verzögerungszeit bei jedem Wiederholungsversuch schrittweise erhöhen, können Sie dem Dienst genügend Zeit geben, sich von vorübergehenden Fehlern zu erholen. Das erhöht langfristig die Erfolgschancen.