Utilisation de clients instrumentés dans les threads de travail - AWS X-Ray

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation de clients instrumentés dans les threads de travail

Note

End-of-support avis — Le 25 février 2027, AWS X-Ray cessera de prendre en charge AWS X-Ray SDKs et Daemon. Après le 25 février 2027, vous ne recevrez plus de mises à jour ni de versions. Pour plus d'informations sur le calendrier de support, consultezChronologie de fin de support du SDK et du daemon X-Ray. Nous vous recommandons de migrer vers OpenTelemetry. Pour plus d'informations sur la migration vers OpenTelemetry, consultez la section Migration de l'instrumentation X-Ray vers OpenTelemetry l'instrumentation.

Scorekeep utilise un fil de discussion pour publier une notification sur Amazon SNS lorsqu'un utilisateur gagne une partie. La publication de la notification prend plus de temps que le reste des opérations de demande combinées et n'affecte pas le client ou l'utilisateur. Par conséquent, l'exécution de la tâche de manière asynchrone est un bon moyen d'améliorer le temps de réponse.

Cependant, le SDK X-Ray pour Java ne sait pas quel segment était actif lors de la création du thread. Par conséquent, lorsque vous essayez d'utiliser le AWS SDK pour Java client instrumenté dans le thread, cela lance un SegmentNotFoundException et fait planter le thread.

Exemple 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) ...

Pour résoudre ce problème, l'application GetTraceEntity obtient une référence au segment dans le thread principal et Entity.run() exécute en toute sécurité le code du thread de travail avec accès au contexte du segment.

Exemple src/main/java/scorekeep/MoveFactory.java— Transmission du contexte de trace à un thread de travail
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(); } }

La demande étant désormais résolue avant l'appel à Amazon SNS, l'application crée un sous-segment distinct pour le thread. Cela empêche le SDK X-Ray de fermer le segment avant d'enregistrer la réponse d'Amazon SNS. Si aucun sous-segment n'est ouvert lorsque Scorekeep a résolu la demande, la réponse d'Amazon SNS risque d'être perdue.

Présentation de suivi avec sous-segment de thread asynchrone.

Pour plus d'informations sur le multithreading, consultez Transmission de contexte de segment entre threads dans une application multithreads.