Red HatでOpenShiftのサポートをしているid:nekopです。3年前くらいまでJBoss Middlewareを主に担当していたので久しぶりなサーバサイドJavaネタとなるのですが、QuarkusというKubernetesネイティブJavaアプリケーションフレームワークをリリースしました。
読み方は「くぉーかす」です。キャッチコピーがSupersonic Subatomic Javaとなっているように、高速軽量コンパクトなランタイムがウリです。また、コンテナ化やクラスのHot reloading対応などの開発容易性も備えています。
現在ではJava EEのアプリケーションサーバ上へのパッケージ化されたアプリケーションのデプロイ、Spring Bootなどに代表されるfat jarを利用したよりモダンなデプロイの2つのデプロイ形態が広く利用されていますが、その次の世代となる軽量なバイナリを生成するネイティブコンパイル可能なデプロイ形態です。
サーバサイドアプリケーションはKubernetes上での実行に対応することを求められるようになってきていますが、KubernetesやFaaSといった実行プラットフォームにデプロイする場合に、通常のJava VMの起動時のCPUの利用量の大きさ、必要なメモリ量の大きさ、バイナリのサイズなどのオーバヘッドはかなり大きなペナルティとなってしまい、結果としてJavaが敬遠されてGoなどの他言語が採用される状況も増えてきました。この課題を解決するために誕生したのがQuarkusです。より詳細な背景についてはEmmanuelのWhy Quarkusというブログエントリに記述されています。
従来のJava EEやSpring BootアプリなどではJava VMとライブラリとアプリで最小130MB程度、実用アプリだと200MBなどとなってしまっていました。Quarkusのgetting-startedをnativeコンパイルしたときに生成されるシングルバイナリのサイズは20MB程度です。このバイナリには標準のJava VMとは異なるVM実装であるSubstrate VMというものが含まれており、動作に別途Java VMがインストールされている必要はありません。このあたりについての詳細はGraalVMのドキュメントAhead-of-time Compilationを参照してください。バイナリサイズの他にランタイムの起動速度、CPU利用量、メモリ利用量などもJava VMに比較するとほとんどの場合で数倍改善されています。
既に日本語でも以下の代表的な記事のほか、多くの紹介記事が出ています。このブログでも技術詳細などについて引き続きアップデートしていこうと思います。
- Javaフレームワーク「Quarkus」登場。Javaコードからネイティブバイナリを生成し瞬時にJavaアプリが起動、コンテナへの最適化を実現。Red Hatがリリース - publickey https://www.publickey1.jp/blog/19/javaquarkusjavajavared_hat.html
- Quarkus: コンテナ上で Java アプリを高速起動する新しい手法のご紹介 - Yoshio Terada https://yoshio3.com/2019/03/11/try-quarkus/
また、Quarkusのリリースに伴い、fat jar形式のランタイムを提供するThorntailの次期メジャーバージョン4.xの開発は終了となりました。Thorntail 2.xについては引き続きメンテナンスは行われる予定です。