APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure Application InsightsでWebFluxとRestTemplateの違いを確認する

f:id:turtle2005:20210614111228p:plain

Distributed Tracingというものをご存じですか? Distributed Tracingは複数のプロセスにわたる呼び出しを1つにまとめてトレース出力する機能です。これを使うと複数のプログラムにわたる呼び出しのどこで時間がかかっているかを特定することができます。システムをMicroserviceとして構成する場合、こうした機能が必須になってきます。AzureではAzure Application InsightsでDistributed Tracing機能が提供されています。

今回はこのDistributed Tracing機能を使ってSpring WebFluxとRestTemplateの2つのHttp Clinet機能の違いを確認してみたいと思います。

今回実験する構成は前段にRestTemplateを利用したpgdemo-restbffというプログラム、WebFluxを利用したpgdemo-bffというプログラムを用意し、それぞれのプログラムからpgdemo-apiというプログラムの2つのEndpointを呼び出す処理を実行しています。

f:id:turtle2005:20210612232227p:plain
Application Insights Mapping Diagram

まずはRestTemplateを利用した呼出しです。コードは以下のようなイメージとなっています。

pgdemo-restbff

こちらで実行した場合の結果が以下のようなものになります。

入口 (restbff/greeting-tasks:1つ目のブロック)から2つのHTTP Request(greetings:2つ目のブロックとtasks:3つ目のブロック)を処理し、それをまとめて応答しています。2つ目と3つ目が順番に実行されているのがわかります。

f:id:turtle2005:20210613002301p:plain
Rest Template Distribute Tracing

続いてWebFluxを利用した呼出しです。

pgdemo-bff

コードの内容はRestの場合と概ね同じですが、2つのリクエストをMono.zipでまとめています。こちらで実行した結果が以下のようなものになります。

入口 (bff/greeting-tasks:1つ目のブロック)から2つのHTTP Request(greetings:2つ目のブロックとtasks:3つ目のブロック)を処理し、それをまとめて応答しています。RestTemplateの場合と違って2つ目と3つ目が並列に実行されていることがわかります。

f:id:turtle2005:20210613002344p:plain
WebFlux Distributed Tracing

2つの結果を見比べてみると、RestTemplate利用時はBlockingで処理するのに対し、WebFluxではNon-blockingで並列に処理していることがわかってくると思います。同じ処理を行うのであれば並列で実行したほうがトータルのレスポンスタイムが改善されることが予想されますので、Microserviceでの実装をお考えの場合はWebFluxを活用するとよいことがわかります。

また、今回はRestTemplateとWebFluxの違いを見るためにApplication Insightsを利用していますが、Distributed Tracingを使うことで通常のプログラムでも処理で時間がかかっているところはないか? 呼び出しを並列にできるところはないのかといった点を確認することができます。ぜひApplication Insightsを活用していただきたいと思います。