Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Versuchen Sie es erneut mit dem Backoff-Muster
Absicht
Das Muster „Wiederholung mit Backoff“ verbessert die Stabilität der Anwendung, indem Operationen, die aufgrund vorübergehender Fehler fehlschlagen, transparent wiederholt werden.
Motivierung
In verteilten Architekturen können vorübergehende Fehler durch Dienstdrosselung, vorübergehenden Verlust der Netzwerkkonnektivität oder vorübergehende Nichtverfügbarkeit von Diensten verursacht werden. Das automatische Wiederholen von Vorgängen, die aufgrund dieser vorübergehenden Fehler fehlschlagen, verbessert die Benutzererfahrung und die Stabilität der Anwendung. Häufige Wiederholungsversuche können jedoch die Netzwerkbandbreite überlasten und zu Konflikten führen. Exponentielles Backoff ist eine Technik, bei der Operationen wiederholt werden, indem die Wartezeiten für eine bestimmte Anzahl von Wiederholungsversuchen verlängert werden.
Anwendbarkeit
Verwenden Sie das Muster „Wiederholungsversuch mit Backoff“, wenn:
-
Ihre Dienste drosseln die Anfrage häufig, um eine Überlastung zu vermeiden, was zu einem429 Zu viele AnfragenAusnahme beim Anrufvorgang.
-
Das Netzwerk ist ein unsichtbarer Akteur verteilter Architekturen, und vorübergehende Netzwerkprobleme führen zu Ausfällen.
-
Der aufgerufene Dienst ist vorübergehend nicht verfügbar, was zu Fehlern führt. Häufige Wiederholungsversuche können zu einer Beeinträchtigung des Dienstes führen, sofern Sie nicht mithilfe dieses Musters ein Backoff-Timeout einführen.
Probleme und Überlegungen
-
Idempotenz: Wenn mehrere Aufrufe der Methode die gleiche Wirkung haben wie ein einziger Aufruf auf den Systemstatus, wird die Operation als idempotent angesehen. Operationen sollten idempotent sein, wenn Sie das Muster „Wiederholungsversuch mit Backoff“ verwenden. Andernfalls könnten Teilaktualisierungen den Systemstatus beschädigen.
-
Netzwerk-Bandbreite: Wenn zu viele Wiederholungsversuche die Netzwerkbandbreite beanspruchen, kann es zu einer Beeinträchtigung des Dienstes kommen, was zu langsamen Reaktionszeiten führt.
-
Szenarien, in denen schnell scheitern: Wenn Sie bei nicht vorübergehenden Fehlern die Ursache des Fehlers ermitteln können, ist es effizienter, schnell zu versagen, indem Sie das Schutzschaltermuster verwenden.
-
Rückzahlungsrate: Die Einführung eines exponentiellen Backoffs kann sich auf das Service-Timeout auswirken und zu längeren Wartezeiten für den Endbenutzer führen.
Implementierung
Hochrangige Architektur
Das folgende Diagramm zeigt, wie Service A die Aufrufe von Service B wiederholen kann, bis eine erfolgreiche Antwort zurückgegeben wird. Wenn Service B nach einigen Versuchen keine erfolgreiche Antwort zurückgibt, kann Service A die Wiederholung beenden und dem Anrufer einen Fehler melden.
Umsetzung mitAWSDienstleistungen
Das folgende Diagramm zeigt einen Workflow zur Ticketverarbeitung auf einer Kundensupportplattform. Tickets von unzufriedenen Kunden werden beschleunigt, indem die Ticketpriorität automatisch erhöht wird. DerTicket info
Die Lambda-Funktion extrahiert die Ticketdetails und ruft denGet sentiment
Lambda-Funktion. DerGet sentiment
Die Lambda-Funktion überprüft die Meinung des Kunden, indem sie die Beschreibung anAmazon Comprehend
Wenn der Anruf an dieGet sentiment
Die Lambda-Funktion schlägt fehl, der Workflow versucht den Vorgang dreimal erneut.AWS Step Functionsermöglicht exponentielles Backoff, indem Sie den Backoff-Wert konfigurieren können.
In diesem Beispiel werden maximal drei Wiederholungsversuche mit einem Erhöhungsmultiplikator von 1,5 Sekunden konfiguriert. Wenn die erste Wiederholung nach 3 Sekunden erfolgt, erfolgt die zweite Wiederholung nach 3 x 1,5 Sekunden = 4,5 Sekunden, und die dritte Wiederholung erfolgt nach 4,5 x 1,5 Sekunden = 6,75 Sekunden. Wenn der dritte Wiederholungsversuch nicht erfolgreich ist, schlägt der Workflow fehl. Für die Backoff-Logik ist kein benutzerdefinierter Code erforderlich. Sie wird als Konfiguration bereitgestellt vonAWS Step Functions.
Beispiel-Code
Der folgende Code zeigt die Implementierung des Musters „Wiederholung mit Backoff“.
public async Task DoRetriesWithBackOff() { int retries = 0; bool retry; do { //Sample object for sending parameters var parameterObj = new InputParameter { SimulateTimeout = "false" }; var content = new StringContent(JsonConvert.SerializeObject(parameterObj), System.Text.Encoding.UTF8, "application/json"); var waitInMilliseconds = Convert.ToInt32((Math.Pow(2, retries) - 1) * 100); System.Threading.Thread.Sleep(waitInMilliseconds); var response = await _client.PostAsync(_baseURL, content); switch (response.StatusCode) { //Success case HttpStatusCode.OK: retry = false; Console.WriteLine(response.Content.ReadAsStringAsync().Result); break; //Throttling, timeouts case HttpStatusCode.TooManyRequests: case HttpStatusCode.GatewayTimeout: retry = true; break; //Some other error occured, so stop calling the API default: retry = false; break; } retries++; } while (retry && retries < MAX_RETRIES); }
GitHubEndlager
Eine vollständige Implementierung der Beispielarchitektur für dieses Muster finden Sie in derGitHubRepositorium beihttps://github.com/aws-samples/retry-with-backoff
Verwandter Inhalt
-
Timeouts, Wiederholungsversuche und Backoff mit Jitter
(Amazon Builders' Library)