As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Usar clientes instrumentais em threads de operador
O Scorekeep usa um thread de operador para publicar uma notificação para o Amazon SNS quando um usuário ganha um jogo. A publicação da notificação demora mais que o restante das operações de solicitação combinadas, e não afeta o cliente ou o usuário. Portanto, a execução da tarefa de forma assíncrona é uma boa maneira de melhorar o tempo de resposta.
No entanto, o X-Ray SDK para Java não sabe qual segmento estava ativo quando o thread foi criado. Como resultado, quando você tenta usar o cliente do AWS SDK for Java instrumentado no thread, ele lança uma SegmentNotFoundException
, o que faz com que o thread falhe.
exemplo 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 corrigir isso, a aplicação usa GetTraceEntity
para obter uma referência ao segmento no thread principal e Entity.run()
para passar o segmento de volta para o gravador no thread de operador.
exemplo src/main/java/scorekeep/MoveFactory.java
: passar contexto de rastreamento para um thread de operador
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();
}
}
Como a solicitação agora é resolvida antes da chamada para o Amazon SNS, a aplicação cria um subsegmento separado para o thread. Isso evita que o X-Ray SDK feche o segmento antes de registrar a resposta do Amazon SNS. Se nenhum subsegmento estava aberto quando o Scorekeep resolveu a solicitação, a resposta do Amazon SNS poderá ser perdida.
Consulte Passar o contexto do segmento entre threads em um aplicativo multithreaded para obter mais informações sobre multithreading.