Ausnahmebehandlung und Wiederholungen - Amazon Neptune

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.

Ausnahmebehandlung und Wiederholungen

Die Entwicklung robuster Anwendungen auf Neptune bedeutet oft, sich auf das Unerwartete vorzubereiten, insbesondere wenn es um die Behandlung von Fehlern geht, die von der Datenbank zurückgegeben werden. Eine der häufigsten Reaktionen auf serverseitige Ausnahmen besteht darin, den fehlgeschlagenen Vorgang erneut zu versuchen. Die Wiederholungslogik ist für ausfallsichere Systeme zwar unerlässlich, Sie müssen sich jedoch darüber im Klaren sein, dass nicht alle Fehler auf die gleiche Weise behandelt werden sollten. Anstatt sich auf generisches Wiederholungsverhalten zu verlassen, kann Ihnen ein durchdachter Ansatz dabei helfen, zuverlässigere und effizientere Anwendungen zu entwickeln.

Warum Wiederholungslogik wichtig ist

Die Wiederholungslogik ist eine wichtige Komponente jeder verteilten Anwendung. Vorübergehende Probleme wie Netzwerkinstabilität, vorübergehende Ressourcenbeschränkungen oder gleichzeitige Änderungskonflikte können dazu führen, dass Operationen fehlschlagen. In vielen Fällen deuten diese Fehler nicht auf ein dauerhaftes Problem hin und können behoben werden, indem Sie warten und es erneut versuchen. Durch die Implementierung einer soliden Wiederholungsstrategie wird der Realität unvollständiger Umgebungen in verteilten Systemen Rechnung getragen und eine höhere Zuverlässigkeit und Kontinuität gewährleistet, ohne dass manuelle Eingriffe erforderlich sind.

Die Risiken wahlloser Wiederholungsversuche

Wenn standardmäßig jeder Fehler wiederholt wird, kann dies mehrere unbeabsichtigte Folgen haben:

  • Vermehrter Konflikt — Wenn Operationen, die aufgrund hoher Parallelität fehlschlagen, wiederholt wiederholt werden, kann sich der Konflikt insgesamt noch verschlimmern. Dies kann zu einem Zyklus fehlgeschlagener Transaktionen und Leistungseinbußen führen.

  • Erschöpfung der Ressourcen — Wahllose Wiederholungsversuche können zusätzliche Systemressourcen verbrauchen, sowohl auf der Client- als auch auf der Serverseite. Dies kann möglicherweise zu einer Drosselung oder sogar zu einer Verschlechterung des Dienstes führen.

  • Höhere Latenz für Clients — Übermäßige Wiederholungsversuche können zu erheblichen Verzögerungen bei Client-Anwendungen führen, insbesondere wenn jede Wiederholung mit Wartezeiten verbunden ist. Dies kann sich negativ auf die Benutzererfahrung und nachgelagerte Prozesse auswirken.

Entwicklung einer praktischen Wiederholungsstrategie

Um eine robuste und effiziente Anwendung zu erstellen, sollten Sie eine Strategie für Wiederholungsversuche entwickeln, die auf die spezifischen Fehlerbedingungen zugeschnitten ist, auf die Ihre Anwendung stoßen kann. Im Folgenden finden Sie einige Überlegungen, die Sie bei Ihrem Vorgehen berücksichtigen sollten:

  • Identifizieren Sie Fehler, die wiederholt werden können — Nicht alle Ausnahmen sollten erneut versucht werden. Beispielsweise sollten Syntaxfehler, Authentifizierungsfehler oder ungültige Abfragen keinen erneuten Versuch auslösen. Neptune bietet Fehlercodes und allgemeine Empfehlungen, bei denen Fehler sicher wiederholt werden können. Sie müssen jedoch die Logik implementieren, die zu Ihrem Anwendungsfall passt.

  • Implementieren Sie exponentielles Backoff — Verwenden Sie bei vorübergehenden Fehlern eine exponentielle Backoff-Strategie, um die Wartezeit zwischen Wiederholungen schrittweise zu verlängern. Dies trägt dazu bei, Konflikte zu vermeiden und das Risiko kaskadierender Ausfälle zu verringern.

  • Berücksichtigen Sie die Länge der ersten Pause. Wenn Sie den ersten Versuch zu schnell ausführen, wird möglicherweise der gleiche Fehler angezeigt, wenn dem Server nicht genügend Zeit zur Freigabe von Ressourcen eingeräumt wurde, die für eine erfolgreiche Abfrage erforderlich sind. Eine längere Pause in den richtigen Situationen könnte ungenutzte Anfragen und die Serverbelastung verringern.

  • Hinzufügen von Jitter zum Backoff — Exponentielles Backoff ist zwar effektiv, kann aber dennoch zu synchronisierten Wiederholungsstürmen führen, wenn viele Clients gleichzeitig ausfallen und es dann gemeinsam erneut versuchen. Das Hinzufügen von Jitter, einer kleinen zufälligen Variation der Backoff-Verzögerung, trägt dazu bei, die Anzahl der Wiederholungsversuche zu verteilen, wodurch die Wahrscheinlichkeit verringert wird, dass alle Clients es gleichzeitig erneut versuchen und es zu einer weiteren Lastspitze kommt.

  • Wiederholungsversuche einschränken — Legen Sie eine angemessene Höchstzahl von Wiederholungsversuchen fest, um Endlosschleifen und eine Erschöpfung der Ressourcen zu verhindern.

  • Überwachen und anpassen — Überwachen Sie kontinuierlich die Fehlerquote Ihrer Anwendung und passen Sie Ihre Wiederholungsstrategie nach Bedarf an. Wenn Sie eine hohe Anzahl von Wiederholungsversuchen für einen bestimmten Vorgang feststellen, sollten Sie überlegen, ob der Vorgang optimiert oder serialisiert werden kann.

Beispielszenarien

Die richtige Wiederholungsstrategie hängt von der Art des Fehlers, der Arbeitslast und den beobachteten Fehlermustern ab. In der folgenden Tabelle sind einige der häufigsten Fehlerszenarien zusammengefasst und es wird erläutert, wie sich die Überlegungen zur Wiederholungsstrategie auf die einzelnen Szenarien auswirken. Für zusätzlichen Kontext folgen erläuternde Absätze.

Szenario

Wiederholbar?

Backoff & Jitter

Erste Pause

Limit für Wiederholungsversuche

Überwachen und anpassen

Gelegentliche CME bei kurzen Anfragen

Ja

Kurzer Backoff, Jitter hinzufügen

Kurz (z. B. 100 ms)

Hoch

Achten Sie auf steigende CME-Raten

Häufiges CME bei länger laufenden Abfragen

Ja

Längerer Backoff, zusätzlicher Jitter

Länger (zum Beispiel 2 Sekunden)

Mittel

Untersuchen Sie Konflikte und reduzieren Sie sie

Speicherlimits für teure Abfragen

Ja

Langer Rückzieher

Lang (zum Beispiel 5-10 Sekunden)

Niedrig

Abfrage optimieren, Warnung, wenn sie persistent ist

Timeout bei moderaten Abfragen

Vielleicht

Backoff moderieren, Jitter hinzufügen

Mäßig (z. B. 1s)

Gering bis Mäßig

Beurteilen Sie die Serverlast und den Abfrageentwurf

Szenario 1: Gelegentliche CME bei kurzen Abfragen

Bei einem Workload, der bei kurzen, einfachen Updates selten ConcurrentModificationException auftritt, sind diese Fehler in der Regel vorübergehend und können problemlos wiederholt werden. Machen Sie vor dem ersten Versuch eine kurze Anfangspause (z. B. 100 Millisekunden). In dieser Zeit kann jede kurzzeitige Sperre aufgehoben werden. Kombinieren Sie dies mit einem kurzen exponentiellen Backoff und Jitter, um synchronisierte Wiederholungsversuche zu vermeiden. Da die Kosten für Wiederholungsversuche gering sind, ist ein höheres Wiederholungslimit sinnvoll. Behalten Sie dennoch die CME-Rate im catch, um jeden Trend zu einer zunehmenden Konkurrenz in Ihren Daten zu erkennen.

Szenario 2: Häufiges CME bei Abfragen mit langer Laufzeit

Wenn in Ihrer Anwendung häufig Abfragen mit langer Laufzeit angezeigt werden, deutet dies CMEs auf schwerwiegendere Konflikte hin. Beginnen Sie in diesem Fall mit einer längeren Anfangspause (z. B. 2 Sekunden), um der aktuellen Abfrage, für die die Sperre gilt, genügend Zeit zum Abschluss zu geben. Verwenden Sie einen längeren exponentiellen Backoff und fügen Sie Jitter hinzu. Begrenzen Sie die Anzahl der Wiederholungen, um übermäßige Verzögerungen und eine übermäßige Ressourcennutzung zu vermeiden. Wenn der Konflikt weiterhin besteht, überprüfen Sie Ihren Workload auf Muster und erwägen Sie, Updates zu serialisieren oder die Parallelität zu reduzieren, um die Ursache zu beheben.

Szenario 3: Speicherlimits für teure Abfragen

Wenn während einer bekanntermaßen ressourcenintensiven Abfrage speicherbasierte Fehler auftreten, können Wiederholungsversuche sinnvoll sein, allerdings erst nach einer langen Anfangspause (z. B. 5 bis 10 Sekunden oder länger), damit der Server Ressourcen freigeben kann. Verwenden Sie eine lange Backoff-Strategie und legen Sie ein niedriges Wiederholungslimit fest, da wiederholte Fehler ohne Änderungen an der Abfrage oder der Arbeitslast kaum behoben werden können. Dauerhafte Fehler sollten Warnmeldungen auslösen und eine Überprüfung der Abfragekomplexität und der Ressourcennutzung veranlassen.

Szenario 4: Timeout bei moderaten Abfragen

Ein Timeout bei einer mäßig teuren Abfrage ist ein zweideutigerer Fall. Manchmal kann ein erneuter Versuch erfolgreich sein, wenn der Timeout auf einen vorübergehenden Anstieg der Serverlast oder der Netzwerkbedingungen zurückzuführen ist. Beginnen Sie mit einer moderaten Anfangspause (z. B. 1 Sekunde), um dem System die Möglichkeit zu geben, sich zu erholen. Wenden Sie einen moderaten Back-Off an und fügen Sie Jitter hinzu, um synchronisierte Wiederholungsversuche zu vermeiden. Halten Sie das Wiederholungslimit niedrig bis moderat, da wiederholte Timeouts auf ein tieferes Problem mit der Abfrage oder der Serverkapazität hindeuten können. Achten Sie auf Muster: Prüfen Sie bei häufigen Timeouts, ob die Abfrage optimiert werden muss oder ob der Neptune-Cluster zu wenig bereitgestellt ist.

Überwachung und Beobachtbarkeit

Die Überwachung ist ein wichtiger Bestandteil jeder Wiederholungsstrategie. Effektive Beobachtbarkeit hilft Ihnen zu verstehen, wie gut Ihre Wiederholungslogik funktioniert, und gibt frühzeitig Hinweise, wenn etwas in Ihrer Workload- oder Clusterkonfiguration behoben werden muss.

MainRequestQueuePendingRequests

Diese CloudWatch Metrik verfolgt die Anzahl der Anfragen, die in der Eingabewarteschlange von Neptune warten. Ein steigender Wert weist darauf hin, dass sich Anfragen häufen. Dies kann ein Zeichen für übermäßige Konflikte, unzureichend bereitgestellte Ressourcen oder Wiederholungsversuche sein. Durch die Überwachung dieser Kennzahl können Sie erkennen, wann Ihre Wiederholungsstrategie Warteschlangenprobleme verursacht oder verschärft, und Sie können dazu veranlassen, Ihren Ansatz zu ändern, bevor Fehler eskalieren.

Andere Metriken CloudWatch

Andere Neptune-Metriken wie CPUUtilizationTotalRequestsPerSecond, und Abfragelatenz bieten zusätzlichen Kontext. Ein hoher CPU-Wert in I/O Kombination mit einer wachsenden Warteschlangenlänge kann beispielsweise darauf hindeuten, dass Ihr Cluster überlastet ist oder dass Abfragen zu groß oder zu häufig sind. CloudWatch Für diese Messwerte können Alarme eingerichtet werden, um Sie auf abnormales Verhalten aufmerksam zu machen und Ihnen zu helfen, Spitzenwerte bei Fehlern oder Wiederholungsversuchen mit den zugrunde liegenden Ressourcenbeschränkungen zu korrelieren.

Neptunstatus und -abfrage APIs

Die Neptune Status API für Gremlin und ihre Analogons APIs für und SPARQL bieten eine Echtzeitansicht der akzeptierten OpenCypherund auf dem Cluster laufenden Abfragen, was nützlich ist, um Engpässe zu diagnostizieren oder die Auswirkungen der Wiederholungslogik in Echtzeit zu verstehen.

Durch die Kombination dieser Überwachungstools können Sie:

  • Erkennen Sie, wann Wiederholungsversuche zu Warteschlangen und Leistungseinbußen beitragen.

  • Finden Sie heraus, wann Sie Ihren Neptun-Cluster skalieren oder Abfragen optimieren sollten.

  • Stellen Sie sicher, dass Ihre Wiederholungsstrategie vorübergehende Fehler behebt, ohne tiefere Probleme zu maskieren.

  • Lassen Sie sich frühzeitig vor neu auftretenden Konflikten oder Ressourcenerschöpfung warnen.

Proaktive Überwachung und Warnmeldungen sind für die Aufrechterhaltung einer gesunden Neptune-Bereitstellung unerlässlich, insbesondere wenn die Parallelität und Komplexität Ihrer Anwendung zunehmen.