スプリングブーツvsクォークス
1. 概要
この記事では、2つの有名なJavaフレームワークSpring BootとQuarkusを簡単に比較します。 最後に、それらの間の相違点と類似点、およびいくつかの特殊性について理解を深めます。
また、いくつかのテストを実行して、パフォーマンスを測定し、動作を観察します。
2. スプリングブーツ
Spring Bootは、エンタープライズアプリケーションに焦点を当てたJavaベースのフレームワークです。 すべてのSpringプロジェクトを接続し、は、多くの本番環境に対応した統合を提供することにより、開発者の生産性を加速するのに役立ちます。
これを行うことにより、構成と定型文の量を減らします。 さらに、設定より規約のおかげで、ランタイムのクラスパスで利用可能な依存関係に基づいてデフォルト構成が自動的に登録され、SpringBootは多くのJavaアプリケーションの市場投入までの時間を大幅に短縮します。
3. Quarkus
Quarkusは、前述のSpring Bootと同様のアプローチを備えた別のフレームワークですが、起動時間の短縮、リソース使用率の向上、効率性を備えた小さなアーティファクトを提供するという追加の約束があります。
クラウド、サーバーレス、コンテナ化された環境向けに最適化されています。 しかし、このわずかに異なる焦点にもかかわらず、Quarkusは最も人気のあるJavaフレームワークともうまく統合されます。
4. 比較
上記のように、両方のフレームワークは他のプロジェクトやフレームワークとの優れた統合を持っています。 ただし、それらの内部実装とアーキテクチャは異なります。 たとえば、Spring Bootは、ブロッキング(サーブレット)とノンブロッキング(WebFlux)の2つのフレーバーでWeb機能を提供します。
一方、 Quarkusも両方のアプローチを提供しますが、Spring Bootとは異なり、ブロッキングと非ブロッキングの両方のアプローチを同時に使用できます。 さらに、Quarkusのアーキテクチャにはリアクティブアプローチが組み込まれています。
そのため、より正確なシナリオを比較するために、SpringWebFluxおよびQuarkusリアクティブ機能で実装された2つの完全にリアクティブなアプリケーションを使用します。
また、Quarkusプロジェクトで利用できる最も重要な機能の1つは、ネイティブイメージ(バイナリおよびプラットフォーム固有の実行可能ファイル)を作成する機能です。 そのため、両方のネイティブイメージも比較に含めますが、 Springの場合、ネイティブイメージのサポートはまだ実験段階です。 これを行うには、GraalVMが必要です。
4.1. アプリケーションのテスト
このアプリケーションは、3つのAPIを公開します。1つはユーザーが郵便番号を作成できるようにし、もう1つは特定の郵便番号の情報を検索できるようにし、最後に都市ごとに郵便番号を照会します。 これらのAPIは、Spring BootとQuarkusの両方を使用して、すでに述べたようにリアクティブアプローチを完全に使用し、PostgreSQLデータベースを使用して実装されました。
目標は、単純なサンプルアプリケーションを作成することでしたが、HelloWorldアプリよりも少し複雑です。 もちろん、データベースドライバーやシリアル化フレームワークなどの実装が結果に影響するため、これは比較に影響します。 ただし、ほとんどのアプリケーションはこれらのことも処理する可能性があります。
したがって、私たちの比較は、どのフレームワークがより優れているか、よりパフォーマンスが高いかについての究極の真実ではなく、これらの特定の実装を分析するケーススタディを目的としています。
4.2. テスト計画
両方の実装をテストするために、 JMeter を使用してテストを実行し、そのメトリックレポートを使用して調査結果を分析します。 また、 VisualVM を使用して、テストの実行中にアプリケーションのリソース使用率を監視します。
テストは5分間実行され、ウォームアップ期間から開始して、同時ユーザーを1,500人に達するまで、すべてのAPIが呼び出されます。 以下に示すように、最初の数秒間にデータベースへの入力を開始し、その後クエリが開始されます。
すべてのテストは、次の仕様のマシンで実行されました。
他のバックグラウンドプロセスからの分離がないため理想的ではありませんが、テストは提案された比較を説明することのみを目的としています。 すでに述べたように、両方のフレームワークのパフォーマンスの広範囲で詳細な分析を提供することは意図されていません。
5. 調査結果
開発者の経験は両方のプロジェクトにとって素晴らしいものでしたが、Spring Bootには、オンラインで見つけることができるより優れたドキュメントとより多くの資料があることを言及する価値があります。 Quarkusはこの分野で改善していますが、まだ少し遅れています。
メトリックに関しては、次のとおりです。
この実験では、QuarkusがJVMバージョンとネイティブバージョンの両方で起動時間の点でSpringBootのほぼ2倍の速さであることがわかりました。 ビルド時間もはるかに速かった。 ネイティブイメージの場合、ビルドには121秒(Quarkus)かかりました。 176秒(Spring Boot)、JVMビルドには7.9秒(Quarkus)かかりました。 22.44秒(スプリングブート)。
アーティファクトのサイズを考慮する限り、SpringBootとQuarkusによって生成された実行可能なアーティファクトは同様のサイズでした。
ただし、他のメトリックに関しては、結論は単純ではありません。 それでは、それらのいくつかを詳しく見ていきましょう。
5.1. CPU
CPU使用率に注目すると、 JVMバージョンは、ウォームアップフェーズの開始でより多くのCPUを消費することがわかります。 その後、CPU使用率が安定し、消費量はすべてのバージョンと比較的等しくなります。
JVMバージョンとネイティブバージョンでのQuarkusのCPU消費量をこの順序で示します。
5.2. メモリー
記憶に関しては、それはさらに複雑です。 まず、両方のフレームワークのJVMバージョンがヒープ用により多くのメモリを予約していることは明らかです。 それでも、 Quarkusが最初から予約するメモリが少なく、、起動時のメモリ使用率についても同じことが言えます。
次に、テスト中の使用率を見ると、ネイティブイメージがJVMバージョンほど効率的または頻繁にメモリを収集していないように見えることがわかります。 いくつかのパラメータを微調整することでこれを改善できるかもしれません。 それにもかかわらず、この比較では、デフォルトのパラメーターのみを使用しました。
したがって、GC、JVMオプション、またはその他のパラメーターは変更されていません。
メモリ使用量のグラフを見てみましょう。
(スプリングブートJVM)
(Quarkus JVM)
(スプリングブートネイティブ)
(Quarkusネイティブ)
Quarkusは、テスト中のスパイクが多かったにもかかわらず、メモリの観点から消費するリソースが少ないようでした。
5.3. 反応時間
最後に、応答時間とピークで使用されるスレッドの数に関して、SpringBootはここに利点があるようです。 より少ないスレッドを使用して同じ負荷を処理すると同時に、応答時間を改善することができました。
この場合、SpringBootNativeバージョンの方がパフォーマンスが向上しています。 しかし、アプリケーションの各バージョンの応答時間の分布を見てみましょう。
(スプリングブートJVM)
より多くの外れ値があるにもかかわらず、Spring Boot JVMバージョンは、おそらくJITコンパイラの最適化が原因で時間の経過とともに最高の進化を遂げました。
(Quarkus JVM)
(スプリングブートネイティブ)
(Quarkusネイティブ)
Quarkusは、リソース使用率が低いという点で強力であることが示されました。 ただし、少なくともこの実験では、SpringBootはより優れたスループットと応答性を示しました。 それにもかかわらず、両方のフレームワークはエラーなしですべての要求を処理することができました。
これだけでなく、パフォーマンスも非常に似ており、大きな違いはありませんでした。
5.4. ドットの接続
すべてを考慮すると、Javaアプリケーションの実装に関しては、両方のフレームワークが優れたオプションであることが証明されました。
ネイティブアプリは高速でリソース消費量が少ないことが示されているため、サーバーレスで寿命の短いアプリケーションや、リソース消費量が少ないことが重要な環境に最適です。
一方、JVMアプリはオーバーヘッドが大きいように見えますが、長期にわたって優れた安定性と高スループットを備えているため、堅牢で長寿命のアプリケーションに最適です。
6. 結論
この記事では、Spring BootフレームワークとQuarkusフレームワーク、およびそれらのさまざまなデプロイメントモードであるJVMとネイティブを比較しました。 また、これらのアプリケーションの他のメトリックと側面についても調べました。
いつものように、テストアプリケーションのコードとそれらをテストするために使用されるスクリプトは、GitHubで利用できます。