Verwenden instrumentierter Clients in Auftragnehmer-Threads - AWS X-Ray

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.

Verwenden instrumentierter Clients in Auftragnehmer-Threads

Anmerkung

End-of-support Hinweis — Am 25. Februar 2027 wird AWS X-Ray die Unterstützung für AWS X-Ray SDKs und Daemon einstellen. Nach dem 25. Februar 2027 werden Sie keine Updates oder Releases mehr erhalten. Weitere Informationen zum Zeitplan für den Support finden Sie unterZeitplan für das Ende des Supports für X-Ray SDK und Daemon. Wir empfehlen die Migration zu OpenTelemetry. Weitere Informationen zur Migration zu OpenTelemetry finden Sie unter Migration von X-Ray-Instrumentierung zu OpenTelemetry Instrumentierung.

Scorekeep verwendet einen Worker-Thread, um eine Benachrichtigung an Amazon SNS zu veröffentlichen, wenn ein Benutzer ein Spiel gewinnt. Die Veröffentlichung der Benachrichtigung dauert länger als alle übrigen Anfragevorgänge zusammen und wirkt sich nicht auf den Client oder Benutzer aus. Die Aufgabe asynchron auszuführen ist daher eine gute Möglichkeit, die Reaktionszeit zu verbessern.

Das X-Ray-SDK SDK for Java weiß jedoch nicht, welches Segment aktiv war, als der Thread erstellt wurde. Wenn Sie also versuchen, den instrumentierten AWS SDK für Java Client innerhalb des Threads zu verwenden, wird ein SegmentNotFoundException Fehler ausgelöst, wodurch der Thread abstürzt.

Beispiel Web-1.error.log
Exception in thread "Thread-2" com.amazonaws.xray.exceptions.SegmentNotFoundException: Failed to begin subsegment named 'AmazonSNS': segment cannot be found. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ...

Um dieses Problem zu beheben, verwendet die Anwendung, GetTraceEntity um einen Verweis auf das Segment im Haupt-Thread abzurufen und Entity.run() den Worker-Thread-Code mit Zugriff auf den Kontext des Segments sicher auszuführen.

Beispiel src/main/java/scorekeep/MoveFactory.java— Übergibt den Trace-Kontext an einen Worker-Thread
import com.amazonaws.xray.AWSXRay; import com.amazonaws.xray.AWSXRayRecorder; import com.amazonaws.xray.entities.Entity; import com.amazonaws.xray.entities.Segment; import com.amazonaws.xray.entities.Subsegment; ... Entity segment = recorder.getTraceEntity(); Thread comm = new Thread() { public void run() { segment.run(() -> { Subsegment subsegment = AWSXRay.beginSubsegment("## Send notification"); Sns.sendNotification("Scorekeep game completed", "Winner: " + userId); AWSXRay.endSubsegment(); } }

Da die Anfrage nun vor dem Aufruf von Amazon SNS gelöst wird, erstellt die Anwendung ein separates Untersegment für den Thread. Dadurch wird verhindert, dass das X-Ray-SDK das Segment schließt, bevor es die Antwort von Amazon SNS aufzeichnet. Wenn zum Zeitpunkt der Bearbeitung der Anfrage durch Scorekeep kein Untersegment geöffnet war, ging die Antwort von Amazon SNS möglicherweise verloren.

Ablaufverfolgungsübersicht mit asynchronem Thread-Untersegment.

Weitere Informationen zu Multithreading finden Sie unter Übermitteln von Segmentkontext zwischen Threads in einer Multithread-Anwendung.