All Products
Search
Document Center

Microservices Engine:Melakukan tugas asinkron untuk rilis canary end-to-end MSE

Last Updated:Jun 28, 2025

Dalam rilis canary end-to-end Microservices Engine (MSE), tag lalu lintas canary dilewatkan selama proses panggilan permintaan. Pada beberapa tugas asinkron yang tidak didukung, pass-through tag lalu lintas canary mungkin terganggu, sehingga menyebabkan pemrosesan lalu lintas canary gagal. Secara default, MSE memungkinkan pass-through tag untuk tugas asinkron yang dibuat menggunakan anotasi @Async di Spring. MSE juga mendukung penyesuaian tugas asinkron untuk mengimplementasikan pass-through tag lalu lintas dengan menambahkan paket pemindaian untuk pass-through asinkron.

Prasyarat

Pastikan Anda menggunakan probe MSE versi V3.2.0 atau lebih baru dalam pratinjau publik. Jika ingin memperbarui probe MSE, bergabunglah dengan grup DingTalk MSE (ID: 43525005207).

Untuk memeriksa versi probe MSE, jalankan perintah berikut:

cat /home/admin/.opt/ArmsAgent/version

Metode 1: Gunakan anotasi @Async di Spring

Secara default, MSE mendukung penggunaan tugas asinkron yang dibuat menggunakan anotasi @Async di Spring untuk melakukan pass-through tag asinkron. MSE secara otomatis meningkatkan eksekutor dan tugas default berikut di Spring:

  • Eksekutor:

    • org.springframework.scheduling.concurrent.ConcurrentTaskExecutor

    • org.springframework.core.task.SimpleAsyncTaskExecutor

    • org.springframework.scheduling.quartz.SimpleThreadPoolTaskExecutor

    • org.springframework.core.task.support.TaskExecutorAdapter

    • org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor

    • org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler

    • org.springframework.jca.work.WorkManagerTaskExecutor

    • org.springframework.scheduling.commonj.WorkManagerTaskExecutor

  • Tugas:

    org.springframework.aop.interceptor.AsyncExecutionInterceptor$1

    org.springframework.aop.interceptor.AsyncExecutionInterceptor$$Lambda$

Metode 2: Tambahkan paket pemindaian untuk pass-through asinkron

Dalam aplikasi Java, Anda dapat menambahkan variabel lingkungan atau parameter startup Java untuk mengaktifkan kemampuan melewati paket pemindaian secara asinkron. Ini membantu melewati tag lalu lintas untuk tugas asinkron. Antarmuka Runnable, Callable, atau Supplier yang terlibat secara otomatis menangkap konteks proses panggilan di thread saat ini ketika objek baru dibuat. Ketika thread digunakan dalam mode asinkron, konteks proses panggilan digunakan untuk mengimplementasikan pass-through end-to-end dari tag lalu lintas canary.

-Dprofiler.thread.match.package="com.alibaba.mse.brightroar.console.service"
Catatan

Untuk menambahkan beberapa paket pemindaian untuk pass-through asinkron, pisahkan nama paket dengan koma (,).

Sebagai contoh, Anda dapat menggunakan paket pemindaian untuk pass-through asinkron untuk memantau tugas asinkron yang dibuat menggunakan kode sampel berikut. Nama lengkap paket pemindaian sampel untuk pass-through asinkron adalah com.alibaba.mse.brightroar.console.service.

Catatan

Saat menambahkan paket pemindaian untuk pass-through asinkron ke konfigurasi aplikasi Anda, Anda dapat menyesuaikan nama paket berdasarkan kebutuhan bisnis. Jika ingin memantau sejumlah besar tugas asinkron, Anda dapat menentukan awalan nama paket alih-alih nama paket lengkap. Dalam contoh ini, Anda dapat memasukkan nama paket lengkap com.alibaba.mse.brightroar.console.service atau awalan com.alibaba.mse. Jika Anda memasukkan awalan, semua paket pemindaian untuk pass-through asinkron di direktori ini dipindai. Namun, awalan pendek dapat melibatkan jumlah paket pemindaian yang terlalu besar untuk pass-through asinkron, yang mengakibatkan penurunan performa. Lanjutkan dengan hati-hati saat menentukan nama paket.

package com.alibaba.mse.brightroar.console.service;

@Service
public class NameService {

    private ExecutorService es = Executors.newFixedThreadPool(5);

    public void name() {
        es.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println(System.currentTimeMillis()+ ": nama saya john, " + Thread.currentThread().getId());
            }
        });
    }
}