Microservices Engine (MSE) エンドツーエンドカナリーリリースでは、カナリートラフィックタグはリクエストの呼び出しプロセスでパススルーされます。サポートされていない一部の非同期タスクでは、カナリートラフィックタグのパススルーが中断される場合があります。その結果、カナリートラフィック処理が失敗します。デフォルトでは、MSEはSpringの @Async アノテーションを使用して作成された非同期タスクのタグのパススルーを許可します。MSEでは、非同期パススルーのスキャンパッケージを追加することで、トラフィックタグのパススルーを実装するために非同期タスクをカスタマイズすることもできます。
前提条件
パブリックプレビュー用の MSE プローブ V3.2.0 以降が使用されています。MSE プローブを更新する場合は、MSE DingTalkグループ (ID: 43525005207
) に参加してください。
MSEプローブのバージョンを照会するには、次のコマンドを実行します。
cat /home/admin/.opt/ArmsAgent/version
方法 1:Spring で @Async アノテーションを使用する
デフォルトでは、MSE では、Spring の @Async アノテーションを使用して作成された非同期タスクを使用して、非同期タグパススルーを実行できます。MSE は、Spring の次のデフォルトのエグゼキューターとタスクを自動的に拡張します。
エグゼキューター:
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
タスク:
org.springframework.aop.interceptor.AsyncExecutionInterceptor$1
org.springframework.aop.interceptor.AsyncExecutionInterceptor$$Lambda$
方法 2:非同期パススルーのスキャンパッケージを追加する
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()); // 現在の時刻とスレッドIDとともに "my name is john" を出力します。
}
});
}
}