Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menggunakan klien berinstrumen di utas pekerja
Scorekeep menggunakan utas pekerja untuk memublikasikan notifikasi ke Amazon SNS ketika pengguna memenangkan game. Penerbitan notifikasi membutuhkan waktu lebih lama daripada gabungan operasi permintaan lainnya, dan tidak memengaruhi klien atau pengguna. Oleh karena itu, melakukan tugas secara asinkron adalah cara yang baik untuk meningkatkan waktu respons.
Namun, X-Ray SDK for Java tidak mengetahui segmen mana yang aktif saat utas dibuat. Akibatnya, ketika Anda mencoba menggunakan klien AWS SDK for Java berinstrumen di dalam utas, itu melempar SegmentNotFoundException
, menabrak utas.
contoh 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)
...
Untuk memperbaikinya, aplikasi menggunakan GetTraceEntity
untuk mendapatkan referensi ke segmen di utas utama, dan Entity.run()
untuk menjalankan kode utas pekerja dengan aman dengan akses ke konteks segmen.
contoh src/main/java/scorekeep/MoveFactory.java
– Melewati konteks pelacakan ke utas pekerja
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();
}
}
Karena permintaan sekarang diselesaikan sebelum panggilan ke Amazon SNS, aplikasi membuat subsegmen terpisah untuk utas. Hal ini mencegah X-Ray SDK menutup segmen sebelum mencatat respons dari Amazon SNS. Jika tidak ada subsegmen yang terbuka saat Scorekeep menyelesaikan permintaan, respons dari Amazon SNS bisa hilang.

Lihat Melewati konteks segmen antara benang dalam aplikasi multithreaded untuk informasi selengkapnya tentang multithreading.