The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.

Eclipse Adoptium、大量Java SE配布APIにQuarkusを採用

Adoptium logo

Javaは世界中で 何百万人もの開発者に使用されており、Redmonkによると、 最近最も使用されているプログラミング言語の第2位に 返り咲いたとのことです。Javaのランタイムおよび開発キットには多くのディストリビューションがありますが、Eclipse Temurin(旧称AdoptOpenJDK)ディストリビューションが最も 人気があることがわかっています。最近、AdoptOpenJDKプロジェクトは、 Eclipse AdoptiumとしてEclipse Foundationに移されました。Adoptiumの目的は、Javaエコシステム全体で使用される高品質なTCK認証ランタイムと関連技術を促進しサポートすることです。Adoptiumは、定期的なビルド、テスト、認証、そしてもちろん、Javaを使った評価、プロトタイプ、本番ワークロードの実行を必要とする何百万人もの開発者にバイナリを提供することによってこれを行います。他のオープンソースのEclipseプロジェクトと同様に、配布APIを支えるチームはほとんどがボランティアであるため、彼らは自分たちの使命を果たすために使用する時間やリソース、技術の最適化を常に模索しています。

チャレンジ

開発者は Adoptium のウェブサイトからワンクリックで直接ディストリビューションをダウンロードできますが、例えば CI/CD パイプラインでこのプロセスを自動化することはより困難になります。これは、Javaのバージョン、リリースタイプ、オペレーティングシステム、アーキテクチャ、JVMの実装などのバリエーションが多いために特に顕著です。そのため、Adoptiumは、これらの変数に基づいてプログラムで事前に構築されたバイナリを発見してアクセスする方法を提供する必要があり、 エンドユーザAPIを作成しました。

AdoptOpenJDKのダウンロード数が 1日あたり約50万件と非常に多いため、APIのパフォーマンスが重要な検討事項となりました。さらに、Adoptium は従来のデータセンターを持たず、これらはすべてMicrosoft Azure上のクラウドで実行されます。不必要なスペースを占有するワークロードを継続的に実行すると、コストが増大する可能性があります。

Download trends
Figure 1. dash.adapttopenjdk.netからの Adoptium ディストリビューションの最近のダウンロード統計です。

2017年、技術チームがAPIを公開する最初の試みは、Node.js + Expressを使ったものでした。リクエスト量や配信バリエーションの数が増えるにつれ、チームはレスポンスタイムが遅くなっていることに気づきましたが、これは量の問題だけではなく、初期に行ったアーキテクチャの選択が原因でした。特に、フロントエンドとバックエンドが同じアプリ内にあるモノリシックアーキテクチャでは、バックエンドが同時リクエストを処理している間、フロントエンドが明らかに遅くなっていました。また、APIにページネーションがないため、結果の最初の数要素だけが必要な場合でも、リクエストが巨大な結果を返すことがありました。

APIの説明を維持するための技術運営委員会の主任開発者は次のように説明しています:

既存のAPIには設計上の欠陥があり、修正するのは容易ではありませんでしたので、新たな実装に置き換えることを検討していました。私たちの小さなチームは、JavaScriptよりもJVM言語の経験が豊富で、これはJavaデータを提供するAPIだったので、自分たちのドッグフードを食べるのは良いことだと考えました。

-Adoptium Technical Steering Committeeのリードデベロッパー

Quarkusへ

2019年7月、チームは、Javaエコシステムの他のフレームワークとの関連作業を通じてQuarkusを発見しました。彼らは特に、Quarkusが約束する、Node.jsやGolangに匹敵する優れたパフォーマンスと小さなフットプリントに興味を持ちました。さらに、Quarkusは Kotlinをファーストクラスでサポートしているため、チームはJavaとKotlinの両方の経験をQuarkusで再利用することができました。

The team found Quarkus extremely easy to develop, especially the Live Coding capability. The familiar JAX-RS APIs in Quarkus made it easy to create the necessary endpoints. The lead engineer explains further:

QuarkusがJAX-RSを使用していることは非常に気に入っています。私たちがすでに慣れ親しんでいることだからです。また、Quarkusで利用できる OpenAPIエクステンションにより、追加作業なしでAPIをSwagger APIブラウザとして公開することが非常に簡単になりました。

-Adoptium Technical Steering Committeeのリードデベロッパー

また、Quarkusを使ったライブコーディングは、アプリケーションの開発に非常に役立ちました。

Quarkusでの開発では、ライブコーディングによる高速なフィードバックループが非常に役立ちました。起動が速いのはいいことですが、私たちのアプリは長時間稼働しているので、それほど重要ではありませんでした。しかし、開発中にAPIを微調整する際に、すぐに再テストができることで、開発時間を大幅に短縮することができました。

-Adoptium Technical Steering Committeeのリードデベロッパー

JVM上のQuarkusの初期設定でのパフォーマンスは、期待をいとも簡単に超えるものでした。

当初は、ほとんどのAPIで1秒以下のレスポンスタイムを実現し、1秒間に約1万件のリクエストを処理できるようにしたいと考えていました。最適化を一切行わなかったにもかかわらず、ほとんどのAPIで1ms以内に応答するようになり、要求していたスループットを簡単に上回ることができました。これは、予測可能な将来に必要とされる数をはるかに上回るものです。また、Quarkusのアプリは、より多くのトラフィックを処理し、より多くの機能を提供しているにもかかわらず、(Node.jsと比較して)半分以下のCPU時間しか使用していません。

-Adoptium Technical Steering Committeeのリードデベロッパー

全体的に見て、Quarkusへの移行は、開発者の生産性や運用効率の面で実際にメリットがあり、非常にポジティブな経験となりました。チームは2019年11月からAdoptium APIの本番でQuarkusを使用しており、非常に安定していることを示しました。

活発なコミュニティ

コミュニティは、Quarkusを含め、あらゆるオープンソースプロジェクトの成功に欠かせない要素です。採用を決定する際にコミュニティの健全性が重要視されるのは当然のことです。Adoptiumでは、これは例を見れば明らかです。

今年の初めに、QuarkusのRESTEasy Reactiveコンポーネントにメモリリークがあることがわかりました。数日のうちに、Quarkusのコミュニティと協力して、問題を特定して修正することができました。これにより、長期的には問題を迅速に解決することができるという確信を得ることができました。

-Adoptium Technical Steering Committeeのリードデベロッパー

Adoptiumの次なる展開

AdoptiumはQuarkusを採用したことに非常に満足しており、継続的なテストやMongoDB(選択したデータベース)のDev servicesサポートなど、Quarkusの新しい機能を試すことを楽しみにしています。

全体的に見て、Quarkusの機能には非常に感銘を受けましたし、Quarkusコミュニティでの経験も素晴らしいものでした。今後もQuarkusがどのように進化していくのか、また、JavaコミュニティのJavaディストリビューションのニーズに応える方法を改善していくことを楽しみにしています。

-Adoptium Technical Steering Committeeのリードデベロッパー

詳細

Eclipse Adoptiumについて

Eclipse Adoptium Top-Level Projectの使命は、Javaエコシステム内で使用される高品質のランタイムと関連技術を生産することです。Eclipse Adoptiumはまた、コードとしてのオープンソースのインフラストラクチャ、包括的な継続的統合ビルドとテストファーム、および広範な品質保証テストを含む成果物を提供します。これらの成果物は、Eclipse Adoptiumプロジェクトや他のランタイム技術構築者が、安全で、Java SE TCKでテストされ、準拠した、生産可能なランタイムを確実に提供するために使用することができます。