Uso de clientes instrumentados en subprocesos de trabajo - AWS X-Ray

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso de clientes instrumentados en subprocesos de trabajo

Scorekeep utiliza un subproceso de trabajo para publicar una notificación en Amazon SNS cuando un usuario gana un juego. La publicación de la notificación tarda más tiempo que el resto de las operaciones de solicitud combinadas y no afecta al cliente o al usuario. Por lo tanto, la realización de la tarea de forma asíncrona es una buena manera de mejorar el tiempo de respuesta.

Sin embargo, el SDK de X-Ray para Java no sabe qué segmento estaba activo cuando se creó el subproceso. Por tanto, cuando se intenta utilizar el cliente AWS SDK for Java instrumentado dentro del subproceso, lanza una SegmentNotFoundException, bloqueando el subproceso.

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

Para solucionar este problema, la aplicación utiliza GetTraceEntity para obtener una referencia al segmento en el subproceso principal y Entity.run() para ejecutar código del subproceso de trabajo con acceso al contexto del segmento.

ejemplo src/main/java/scorekeep/MoveFactory.java: transferencia de contexto del rastro a un subproceso de trabajo
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(); } }

Dado que la solicitud ya se ha resuelto antes de la llamada a Amazon SNS, la aplicación crea un subsegmento independiente para el subproceso. Esto impide que el SDK de X-Ray cierre el segmento antes de que registre la respuesta desde Amazon SNS. Si no hay ningún subsegmento abierto cuando Scorekeep resuelve la solicitud, se podría perder la respuesta de Amazon SNS.

Información general de rastreo con subsegmento de subproceso asíncrono.

Consulte Transmisión de contexto de segmento entre subprocesos en una aplicación multiproceso para obtener más información acerca de los subprocesos múltiples.