全部產品
Search
文件中心

Microservices Engine:MSE全鏈路灰階支援非同步任務

更新時間:Jul 06, 2024

MSE全鏈路灰階需要在請求的調用鏈路中傳遞灰階流量標籤,如果遇到一些不支援的非同步任務情境,可能會導致流量的標籤傳遞中斷,從而引起灰階流量處理失敗。對於通過Spring的@Async註解實現的非同步任務,MSE預設支援對其進列標籤傳遞。此外,MSE還支援通過添加非同步透傳掃描包自訂非同步任務實現流量標籤透傳。

前提條件

請確保您的MSE探針版本為v3.2.0及以上公測版本。如需將探針升級到新版本,請加入MSEDingTalk群43525005207進行升級。

您可以使用以下命令查看探針版本:

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

方式一:預設支援Spring的@Async註解

MSE預設支援使用Spring的@Async註解實現的非同步任務進行非同步標籤透傳。對於下列Spring架構中預設的Executor和Task,MSE會自動完成增強:

  • Executor:

    • 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

  • Task:

    org.springframework.aop.interceptor.AsyncExecutionInterceptor$1

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

方式二:添加非同步透傳掃描包

在Java應用中,您可以通過添加環境變數或Java啟動參數的方式使用非同步透傳掃描包能力,實現非同步任務的流量標籤透傳。這種能力涉及到的Runnable、Callable和Supplier介面在建立新對象時會自動捕獲當前線程調用鏈的上下文,並在非同步線程中執行時使用該調用鏈上下文,實現灰階流量標的全鏈路透傳。

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

如需添加多個非同步透傳掃描包,可以使用半形逗號(,)分隔。

例如,對於通過以下範例程式碼建立的非同步任務,您可以使用添加非同步透傳掃描包的方式對此非同步任務進行監控。此範例程式碼中,非同步透傳包名com.alibaba.mse.brightroar.console.service

說明

在配置時,您可以按需調整非同步透傳包名的範圍。若需監控的非同步任務過多,您可以縮小非同步透傳包名的範圍。在本樣本中,除了輸入完整的非同步透傳包名com.alibaba.mse.brightroar.console.service以外,您還可以輸入更短的首碼包名com.alibaba.mse來自動掃描此目錄下的所有子透傳包。但需注意的是,若首碼包名範圍過大,會對效能產生影響,請謹慎操作。

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()+ ": my name is john, " + Thread.currentThread().getId());
            }
        });
    }
}

相關文檔

如果您的流量不符合預期,可以開啟採集請求詳情開關對鏈路進行分析。具體操作,請參見全鏈路灰階可觀測問題排查