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
Scorekeep verwendet einen Auftragnehmer-Thread, um eine Benachrichtigung in 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 for Java erkennt jedoch nicht, welches Segment aktiv war, wenn der Thread erstellt wird. Wenn Sie also versuchen, den instrumentierten AWS SDK for Java-Client innerhalb des Threads zu verwenden, wird eine SegmentNotFoundException
ausgegeben und der Thread stürzt ab.
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 dies zu beheben, verwendet die AnwendungGetTraceEntity
um einen Verweis auf das Segment im Hauptthread zu erhalten, undEntity.run()
um den Worker-Thread-Code mit Zugriff auf den Kontext des Segments sicher auszuführen.
Beispiel src/main/java/scorekeep/MoveFactory.java
- Übergeben von Übergeben von Ablaufverfolgungskontext an
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 jetzt vor dem Aufruf von Amazon SNS behoben 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 Scorekeep die Anfrage gelöst hat und kein Untersegment offen war, kann die Antwort von Amazon SNS verloren gehen.
Weitere Informationen zu Multithreading finden Sie unter Übermitteln von Segmentkontext zwischen Threads in einer Multithread-Anwendung.