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を呼び出す処理を実行しています。
まずはRestTemplateを利用した呼出しです。コードは以下のようなイメージとなっています。
こちらで実行した場合の結果が以下のようなものになります。
入口 (restbff/greeting-tasks:1つ目のブロック)から2つのHTTP Request(greetings:2つ目のブロックとtasks:3つ目のブロック)を処理し、それをまとめて応答しています。2つ目と3つ目が順番に実行されているのがわかります。
続いてWebFluxを利用した呼出しです。
コードの内容はRestの場合と概ね同じですが、2つのリクエストをMono.zipでまとめています。こちらで実行した結果が以下のようなものになります。
入口 (bff/greeting-tasks:1つ目のブロック)から2つのHTTP Request(greetings:2つ目のブロックとtasks:3つ目のブロック)を処理し、それをまとめて応答しています。RestTemplateの場合と違って2つ目と3つ目が並列に実行されていることがわかります。
2つの結果を見比べてみると、RestTemplate利用時はBlockingで処理するのに対し、WebFluxではNon-blockingで並列に処理していることがわかってくると思います。同じ処理を行うのであれば並列で実行したほうがトータルのレスポンスタイムが改善されることが予想されますので、Microserviceでの実装をお考えの場合はWebFluxを活用するとよいことがわかります。
また、今回はRestTemplateとWebFluxの違いを見るためにApplication Insightsを利用していますが、Distributed Tracingを使うことで通常のプログラムでも処理で時間がかかっているところはないか? 呼び出しを並列にできるところはないのかといった点を確認することができます。ぜひApplication Insightsを活用していただきたいと思います。