非同期アプリケーションは同時に複数の作業が実行できるため、ある作業の完了中に別の作業を続行できます。これにより、全体の処理時間が短縮され、ユーザー経験が向上します。
非同期方式は同期よりも複雑ですが、結果が与えられるのに時間がかかる場合でも、その間に他の作業を行うことができるため、リソースを効率的に使用できるというメリットがあります。非同期アプリケーションの分散できてイベント中心的な特性は、効率性の点で多くのメリットがありますが、複雑さが高まり、アプリケーションのモニタリングに困難があります。 非同期アプリケーションモニタリングのいくつかの困難は次のとおりです。
① 順次追跡の難しさ:非同期ワークフローは線形的で順次的な経路に従わないため、実行フローを追跡することは難しいです。既存のモニタリングツールは、アプリケーションプロセスの明確なエンドツーエンドビューを提供できない可能性があります。
② 複雑なイベント処理:非同期アプリケーションには、相互に関連するイベントとトリガーの多い複雑なイベント中心のアーキテクチャが含まれることがよくあります。これらのイベントとその依存関係をモニタリングすることは容易ではないだけでなく、アプリケーションのパフォーマンスにどのような影響を与えるかを理解するのも難しいかもしれません。
③ スケーラビリティと並列処理:非同期アプリケーションは、高レベルの並行性と並列処理を処理するように設計されています。モニタリングツールは、パフォーマンスに影響を与えることなく複数の同時プロセスとスレッドからデータを収集できるように適切に拡張する必要があります。
④ 遅延時間と非同期呼び出し:非同期ワークフローで遅延時間を追跡するのは難しいかもしれません。非同期操作には複数のステップと待ち時間が含まれる可能性があるため、同期操作よりも完了するのにかかる時間を測定するのがより難しい可能性があります。
⑤ データの粒度:一部のモニタリングツールは高レベルの指標を提供できますが、非同期ワークフロー内で詳細を理解するのは難しい場合があります。非同期作業の実行に関する詳細なデータをスクリーンショットするためのツールが不可欠です。
⑥ イベント順番:非同期システムでイベントの正しい順番を確保することは非常に重要です。モニタリングツールは、順番が合わなかったりまたは遅延イベントに関連する問題を特定して解決しなければなりません。
⑦ ボトルネックの特定:非同期システムでパフォーマンスのボトルネックを検出すると、ワークフローのさまざまな部分で速度が低下する可能性があるため、複雑になる可能性があります。効果的なモニタリングは、ボトルネックの正確な位置を特定しなければなりません。
⑧ エラー処理と例外の追跡:非同期アプリケーションでエラーと例外を処理することは、エラーが非同期的に伝播する可能性があるため、難しい作業です。モニタリングツールは、エラー処理に関するインサイトを提供し、問題を特定して解決しなければなりません。
⑨ 分散システム:非同期アプリケーションには、複数のコンポーネントが異なるサーバーで実行される分散システムが含まれることがよくあります。これらの分散コンポーネントをモニタリングし、相互作用を追跡するのは複雑な場合があります。
⑩ 長期実行作業:一部の非同期作業は長期間実行される可能性があり、これらの長期実行作業のリソース消費と状態をモニタリングすることはアプリケーションのパフォーマンスを維持するために非常に重要です。
⑪ データボリュームと保存:非同期アプリケーションは、特にイベントログからかなりの量のデータを生成できます。モニタリングツールは、生成されるデータ量を処理し、データを保存および集約するためのメカニズムを提供する必要があります。
⑫ 異常の兆候の検出:非同期アプリケーションの異常の兆候を識別することは、予想される動作が明確に定義されていない可能性があるために困難な場合があります。モニタリングツールは、高度な異常兆候検出技術を使用して、予期しないパターンと標準から逸脱した偏差を特定する必要があります。
これらの問題を解決するには、非同期アプリケーション用にトランザクション追跡が可能なソリューションを使用する必要があります。WhaTapアプリケーションはどのように非同期アプリケーション分散追跡が可能ですか?
WhaTapはJavaバイトコードを操作してオープンソースライブラリまたはフレームワークを追跡します。たとえば、reactorベースのspring-webfluxを追跡するために、バイトコード操作とreactorライブラリが提供しているOperatorを活用して、オープンソースライブラリに追跡コードを追加してトランザクション追跡しています。
アプリケーションを非同期で構成する場合、1つのトランザクションで複数の非同期オープンソースを利用することがよくあります。たとえば、spring-boot Web トランザクションで tomcat、spring-cloud-gatway、redis、kafka、r2dbc などを呼び出すことがよくあります。この場合、WhaTab Javaエージェントは各オープンソースライブラリに追跡コードを追加して、非同期トランザクションを連携追跡してモニタリングできるように支援しています。
ユーザーのアプリケーションでフレームワークまたはオープンソースを使用している場合は、WhaTap Javaエージェントを介して追跡できる設定を提供します。Javaエージェント設定ファイル(whatap.conf)にweavingオプションを追加して使用できます。
上記の例のように、フレームワークやオープンソースでspring-boot-3.x、feign-client-11、okhttp3-4.4を使用している場合は、次のようにオプションを設定してください。
さらに、WhaTapが追跡できるフレームワークまたはオープンソースリソースについては、WhaTap Docsリンクを参照してください。
一緒に見ると良いリンク:WhaTapが連携追跡をサポートするフレームワーク/オープンソース
ユーザーのJavaアプリケーションプロジェクトにエージェントとしてhookingするCompletableFutureメソッドを追加してください。
trace
で統一Supplier
, Consumer
, Runnable
, Future
package io.home.test.util;import java.util.concurrent.Future;import java.util.function.Consumer;import java.util.function.Supplier;public class W {public static Supplier trace(Supplier f) {return f;}public static Consumer trace(Consumer f) {return f;}public static Runnable trace(Runnable f) {return f;}public static Future trace(Future f) {return f;}}
エージェント設定のために whatap.conf ファイルを以下のファイルにオプションを追加してください。
whatap.conf
hook_completablefuture_patterns=io.home.test.util.W.*
trace
メソッドを追加してトランザクションをリンクしてください。hook_service_patterns
オプションでサービスを開始する必要があります。
public CompletableFuture serviceATimeout() {return CompletableFuture.supplyAsync(() -> {RestTemplate restTemplate = new RestTemplate();return restTemplate.getForObject("http://localhost:8081/api/serviceB/timeout", String.class);});}
io.home.test.util.W.trace()
適用
// io.home.test.util.W.trace() 適用public CompletableFutureserviceATimeout() {return CompletableFuture.supplyAsync(W.trace(() -> {RestTemplate restTemplate =newRestTemplate();return restTemplate.getForObject("http://localhost:8081/api/serviceB/timeout", String.class);}));}
非同期アプリケーションが追跡するのが難しい場合は、WhaTap Application Monitoringを試してください。WhaTapはメトリックに対してリアルタイムでインサイトを提供し、問題を解決し、非同期アプリケーションのパフォーマンスを最適化できます。