Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Fehler und Wiederholungen bei Cloud-Aufrufen

Nach dieser Lektion: Ich kann einen Fehler, den man wiederholt, von einem unterscheiden, den man behebt.

Lektion, 55 Min.Keine Befehle

Manche Fehler beheben sich selbst

Ein Cloud-Dienst beantwortet jeden Aufruf, und manchmal ist die Antwort ein Fehler. Ein Fehlercode sagt Ihnen, welche Art es ist.

Ein fehlender S3-Bucket bleibt fehlend, wenn Sie noch einmal fragen. Eine ausgelastete DynamoDB-Tabelle antwortet vielleicht eine Sekunde später. In dieser Lektion lernen Sie, beides zu unterscheiden und das Richtige zu wiederholen.

Am Ende dieser Lektion

Notiz

Ich kann einen Fehler, den man wiederholt, von einem unterscheiden, den man behebt.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Fehlercodeein kurzer Name dafür, was schiefgingNoSuchKey
Statuscodeeine Zahl, die eine Antwort in eine Familie einordnet404
Drosselungein Dienst, der Aufrufe ablehnt, weil Sie zu viele geschickt haben
Wiederholungdenselben Aufruf noch einmal schicken
Backoffvor jeder Wiederholung länger warten
Jitterein zufälliger Anteil der Wartezeit, damit Aufrufer nicht im Gleichschritt gehen

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein Fehler hat einen Code und einen Status

Schlägt ein Aufruf fehl, gibt Ihnen boto3 einen Fehler. Er enthält einen Statuscode, etwa 404, und einen Fehlercode, etwa NoSuchKey.

Prüfen Sie den Fehlercode und den Status. Prüfen Sie nicht die Meldung: Ihr Wortlaut kann sich zwischen Diensten ändern, und der des Emulators weicht an manchen Stellen vom echten ab.

Beispiel: Fehler, gelesen aus aufgezeichneten Antworten

AufrufCodeStatusWiederholen?
get_object, Schlüssel fehltNoSuchKey404Nein, den Schlüssel beheben
head_object, Schlüssel fehlt404404Nein, es gibt keinen Body zu lesen
list_objects_v2, Bucket fehltNoSuchBucket404Nein, den Bucket anlegen
put_item, Bedingung falschConditionalCheckFailedException400Nein, die Antwort ist die Antwort
query, falscher SchlüsselnameValidationException400Nein, den Aufruf beheben
send_message, Warteschlange fehltAWS.SimpleQueueService.NonExistentQueue400Nein, die Warteschlange anlegen

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Run: Code und Status lesen

Code: python
antworten = [
    {"error": {"Code": "NoSuchKey", "Message": "Fehlt.", "HTTPStatusCode": 404}},
    {"error": {"Code": "ConditionalCheckFailedException", "Message": "Nein.", "HTTPStatusCode": 400}},
    {"error": {"Code": "InternalServerError", "Message": "Hoppla.", "HTTPStatusCode": 500}},
    {"Items": []},
]
for antwort in antworten:
    if "error" not in antwort:
        print("hat geklappt")
    else:
        fehler = antwort["error"]
        print(fehler["Code"], fehler["HTTPStatusCode"])

Wiederholen Sie, was beim nächsten Mal klappen kann

Manche Fehler sagen: "jetzt nicht". Eine Drosselung heißt, Sie haben zu viele Aufrufe geschickt. Ein Status ab 500 heißt, der Dienst hatte einen Fehler. Beides kann vergehen, wenn Sie warten.

Andere Fehler sagen: "nicht dieser Aufruf". Ihr Aufruf war falsch, also scheitert derselbe Aufruf jedes Mal. Beheben Sie ihn lieber.

Ein häufiger Fehler

Warnung

Viele wiederholen sicherheitshalber jeden Fehler. Ein falscher Schlüssel scheitert dann fünfmal und verschwendet die Wartezeit. Wiederholen Sie nur Drosselungen und Serverfehler. Beheben Sie jeden anderen Fehler, denn derselbe Aufruf bekommt dieselbe Antwort.

Run: Fehler in Wiederholen und Beheben sortieren

Code: python
# Die Drosselungs-Codes sind die dokumentierten, hier nicht aufgezeichnet.
DROSSELUNG = ["ThrottlingException", "ProvisionedThroughputExceededException", "SlowDown"]

def lohnt_wiederholung(fehler):
    if fehler["HTTPStatusCode"] >= 500:
        return True
    return fehler["Code"] in DROSSELUNG

fehlerliste = [
    {"Code": "NoSuchKey", "HTTPStatusCode": 404},
    {"Code": "SlowDown", "HTTPStatusCode": 503},
    {"Code": "ThrottlingException", "HTTPStatusCode": 400},
    {"Code": "ValidationException", "HTTPStatusCode": 400},
]
for fehler in fehlerliste:
    print(fehler["Code"], lohnt_wiederholung(fehler))
# Nehmen Sie "RequestLimitExceeded" in DROSSELUNG auf und testen Sie es.

Backoff wartet jedes Mal länger

Ist ein Dienst ausgelastet, macht eine Wiederholung eine Millisekunde später ihn noch voller. Warten Sie also, und nach jedem Fehlschlag länger. Die Wartezeit zu verdoppeln ist üblich. Setzen Sie eine Obergrenze, damit die Wartezeit nie über ein Limit wächst.

Nun kommt Jitter dazu: Warten Sie einen zufälligen Anteil dieser Zeit. Ohne ihn wachen hundert Aufrufer gleichzeitig auf und scheitern gleichzeitig wieder.

Beispiel: die Obergrenze jeder Wartezeit

VersuchVerdoppeltMit Obergrenze 8Wartezeit bei Zufall 0,5
10,5 Sekunden0,50,25
21 Sekunde10,5
32 Sekunden21
44 Sekunden42
58 Sekunden84
616 Sekunden84

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Run: eine Wartezeit, die Sie testen können

Code: python
# zufall ist eine Zahl von 0 bis 1. Ein echter Aufrufer übergibt random.random().
# Ein Test übergibt eine feste Zahl, damit sich die Antwort nie ändert.
def wartezeit(versuch, basis, grenze, zufall):
    obergrenze = min(grenze, basis * 2 ** (versuch - 1))
    return obergrenze * zufall

for versuch in range(1, 7):
    print(versuch, wartezeit(versuch, 0.5, 8, 1.0), wartezeit(versuch, 0.5, 8, 0.5))
# Ändern Sie die Obergrenze von 8 in 2. Welche Versuche ändern sich?

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.