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

Scorekeep utilise un thread de travail pour publier une notification destinée à Amazon SNS lorsqu'un utilisateur remporte un jeu. 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.

Toutefois, le kit SDK X-Ray pour Java ne sait pas quel segment était actif lorsque le thread a été créé. En conséquence, lorsque vous essayez d'utiliser le client AWS SDK for Java instrumenté dans le thread, une exception SegmentNotFoundException est envoyée et le thread s'arrête.

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 utiliseGetTraceEntitypour obtenir une référence au segment dans le thread principal, etEntity.run()pour exécuter en toute sécurité le code de thread de travail avec accès au contexte du segment.

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

Etant donné que la demande est résolue avant l'appel à Amazon SNS, l'application crée un sous-segment distinct pour le thread. Cela empêche le kit SDK X-Ray de fermer le segment avant qu'il n'enregistre la réponse d'Amazon SNS. Si aucun sous-segment n'est ouvert lorsque Scorekeep résout la demande, la réponse d'Amazon SNS peut ê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.