Red Hatは,GraalVMとOpenJDK HotSpot用に開発されたKubernetesネイティブなJavaフレームワークのQuarkusをリリースした。反応型(reactive)と命令型(imperative)を統合したプログラミングモデルの提供により,JavaをKubernetesとサーバレス環境のリーディングプラットフォームとすることを目指す。
Quarkusは,Eclipse MicroProfileやVert.xといった,Java開発者が使用する一連のライブラリを活用することで,フルスタックのフレームワークを実現する。Quarkusの依存性注入はCDIに基づいており,JPA/Hibernate,JAX-RS/RESTEasyなどが利用できる。さらにQuarkusには,サードパーティのフレームワーク開発者が利用可能な拡張フレームワークが含まれている。この拡張フレームワークは,GraalVMネイティブバイナリにコンパイルすることも可能だ。
RedHatによると,Quarkusは,コンテナおよびKubernetes上でマイクロサービスの自動スケールアップ/ダウンを実現する高速スタートアップ,マイクロサービスアーキテクチャデプロイメントでのコンテナ密度の最適化に有効な低いメモリ使用量,アプリケーションおよびコンテナイメージのフットプリントの削減などにより,高いランタイム効率を実現している。
(イメージ引用: https://quarkus.io/)
Quarkusは,命令型と反応型のモデルの両方をシームレスに提供するように設計されており,命令型モデルに習熟していて新たなパラダイムの習得を望まないJava開発者にも,クラウドネイティブモデルおよびリアクティブモデルによるアプローチを採用する開発者にも採用されることを目標としている。
命令型:
@Inject
SayService say;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return say.hello();
}
反応型:
@Inject @Stream("kafka")
Publisher reactiveSay;
@GET
@Produces(MediaType.SERVER_SENT_EVENTS)
public Publisher stream() {
return reactiveSay;
}
以下に示すAWS Lambdaの例のように,Quarkusを使用してサーバレス環境で使用する機能を実装することも可能である。
public class HelloLambda implements RequestHandler {
@Inject
HelloGreeter greeter;
@Override
public String handleRequest(HelloRequest request, Context context) {
return greeter.greet(request.firstName, request.lastName);
}
}
Quarkusはほとんど,あるいはまったく設定する必要なく,直感的に動作するように設計されている。これにより,新規プロジェクトを次のように構築することが可能だ。
mvn io.quarkus:quarkus-maven-plugin:0.12.0:create \ -DprojectGroupId=my-groupId \ -DprojectArtifactId=my-artifactId \ -DprojectVersion=my-version \ -DclassName="org.my.group.MyResource"
QuarkusにはLive Coding機能もあるため,コード記述 → コンパイル → デプロイ → ブラウザ更新 → 繰り返し,という退屈なサイクルを回避できる。"mvn compile quarkus:dev"を実行すると,Quarkusが開発モードで起動し,受信したHTTP要求を保留して,アプリケーションのソースファイルが更新されていないかチェックするようになる。更新されていれば,そのファイルを透過的にコンパイルし,変更されたファイルでアプリケーションを再デプロイした上で,更新されたアプリケーションによってHTTPリクエストを継続する。
Kubernetesやマイクロサービス,ファンクション・アズ・ア・サービス(FaaS),クラウドネイティブアプリケーションが高いレベルの生産性や効率性を提供するクラウド時代において,Quarkusは,それらの興味深い代替手段であるということは言えるだろう。
Quarksに関する詳細は,quarkus.ioのページで確認することができる。 Quarkusを使ってみたい開発者は"getting started guide"や,提供されているその他のガイドにアクセスするとよいだろう。