The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.
このページを編集

Quarkus エクステンションの成熟度マトリックス

優れた Quarkus エクステンションとはどのようなものでしょうか? Quarkus エクステンションにはどのような機能が必要でしょうか? もちろん、構築するエクステンションによって異なりますが、多くのエクステンションに共通する一連の属性があります。このドキュメントでは、それらの属性について説明します。

A maturity matrix

これは、1 行内であっても、正確な順序を定義するものではありません。エクステンションごとに目標が異なり、開発者ごとに最も重要な機能に関する見解が異なります。たとえば、エクステンションの Dev UI タイルの強化よりも、優れたプログラミングモデルを優先する場合があります。それで問題ありません。

また、すべての手順がすべてのエクステンションに適用されるわけではありません。たとえば、エクステンションが外部サービスに依存していない場合は、Dev Service は必要ありません。

エクステンションの最初のバージョンで、すべての機能に対応していなくてもまったく問題ありません。実際のところ、エクステンションが 最終的に高度な機能に_対応しなくても構いません_。これはあくまで推奨される開発の進め方であり、必須の機能セットではありません。

また、このリストにはエクステンションの技術的な機能のみが含まれていることに注意してください。 また、エクステンションをどのように共有するか、そしてエクステンションをどのように提示するかについても検討する必要があります。 Quarkiverse Hub の 新しいエクステンションのチェックリスト には、エクステンションがエコシステムに参加できる便利な方法のリストがあります。 また、Quarkus ツールで使用される quarkus-extension.yaml ファイル のメタデータに時間を費やすことも適切です。

これらの機能を実現する方法についていくつかのヒントを紹介します。

実行モード

Quarkus アプリケーションは通常の jar ベースの JVM アプリケーションとして実行できます。 または、開発モードでライブコーディングするか、ネイティブバイナリーにコンパイルします。 各環境では、フレームワーク拡張に対する要求が異なります。

JVM モードで動作

ほとんどのエクステンションの場合、これが最低限の期待値です。 既存のライブラリーをラップする場合、これは通常簡単に実現できますが、エクステンションがまったく新しい機能を提供する場合は、もう少し作業が必要になる可能性があります。Quarkus は、ユニットテストと結合テスト エクステンション用のツールを提供します。

開発モードで動作します

場合によっては、ラップされたライブラリーが開発モードに対応できるように追加の作業が必要になることがあります。これは、クラスローディングの仕組みが異なり、ホットリロードによって一部の前提が崩れる可能性があるためです。エクステンションは、Dev モード向けの特別な処理 を追加することもできます。 Dev モードを検証する自動テストを追加するには、QuarkusDevModeTest を拡張するテスト を追加できます。

ネイティブアプリケーションとしての実行

多くのライブラリーにとって、ネイティブモードのサポートはエクステンションを作成する主な動機です。必要になる可能性のあるいくつかの適応の詳細は、ネイティブ実行可能ファイルのサポートに関するガイド を参照してください。

開発者の満足度

開発者の満足度は、Quarkus の重要な原則です。 開発を楽しむためのエクステンションケイパビリティーを紹介します。

設定サポート

エクステンションは、Quarkus 設定モデルとの統合 によって、Quarkus のインテグレーション設定をサポートする必要があります。 エクステンションの作成ガイドには、Quarkus の設定 に関する詳細なガイダンスが記載されています。

CDIBean

Quarkus エクステンションは、ユーザーアプリケーションがスムーズに使用できるように、CDI 経由でコンポーネントを公開 することを目指す必要があります。 すべてを CDI Bean として注入可能にしておくと、特に mocking でテストにも役立ちます。

Dev Services

Dev Services は通常、データソースのデータベース、セキュリティーの Keycloak インスタンス、メッセージングの Apache Kafka インスタンスなど、何かに接続するエクステンションに関連しています。

開発サービスを提供するには、 DevServicesResultBuildItem ビルドアイテムを使用します。詳細は、Dev Services のハウツー を参照してください。

基本的な Dev UI

すべてのエクステンションには、Dev UI のタイルが表示されます。デフォルトのタイルは、エクステンションメタデータ から情報を取得します。これは、メタデータを正しく取得するために少し時間をかける必要があるもう 1 つの理由です。

エクステンションは、Dev UI フックを使用して、ユーザーに追加情報を提示します。たとえば、タイルに外部コンソールへのリンクや、単純なテキストメトリクスを表示する内部ページを含めることができます。エクステンション開発者向けの Dev UI ガイドを参照してください。

リッチ Dev UI

一部のエクステンションは非常に洗練された Dev UI を提供します。 たとえば、実行中のアプリケーションと対話したり、リロードに応答したり、アプリケーションメトリクスを視覚化したり、アプリケーション固有のログをストリームしたりできるようになります。 エクステンション開発者向けの開発 UI ガイドでも、これらのより高度なオプションについて説明しています。

楽しいプログラミングモデル

Quarkus のビルド時最適化の思想により、エクステンションは API のボイラープレートを整理し、プログラミングモデルをより簡潔かつ表現力豊かにすることができます。 出発点としては、Jandex を使用して、ユーザーのコードをスキャンし、アノテーションやその他のマーカーを検出する方法が適切で一般的です。 新しく便利な方法を提供することは適切ですが、ユーザーが慣れ親しんでいる通常のパターンを壊さないことも重要です。

この分野でのアイデアの参考として、シンプル化されたロギングPanache を使用したシンプルな Hibernate ORM@RestQuery アノテーション、または Quarkus がテストコンテナを 設定なしで使用できるようにする方法 を参照してください。

Codestart アプリケーションテンプレート

Codestarts は、ユーザー向けのアプリケーションを生成するために使用できるテンプレートです。 エクステンションは、独自のコードスタートテンプレートを提供する ことができます。

Supersonic subatomic パフォーマンス

エクステンションは、ビルド時のアプリケーション情報を活用し、不必要なランタイムのコードパスを排除するべきです。これを Supersonic Subatomic パフォーマンスと呼んでいます。 Quarkus は処理をビルド時に移行して、アプリケーションの 高速な起動、高いスループット、低いメモリ消費を実現します。パフォーマンスチューニングは広範なテーマですが、エクステンションはビルド時のアプリケーション情報を活用し、ランタイムの不要なコードパスを排除することが求められます。

静的な初期化

可能な限り多くの初期化を静的に実行します。 これにより、実行時のオーバーヘッドを回避できます。

リフレクションを生成されたバイトコードに置き換える

多くの Java ライブラリーは、実行時に判断を遅らせるためにリフレクションを多用しています。Quarkus は、ロジックをビルド時に移行し、不必要な動的処理を削減することでパフォーマンスを向上させることを目指しています。 エクステンションは、リフレクションをビルド時のコードに置き換えることを目標とすべきです。これを可能にするのが、Jandex という「オフライン・リフレクション」ライブラリーです。また、既存のライブラリーに対してバイトコード変換を行う必要がある場合もあります。

リフレクションを排除する方法と、それがパフォーマンスにどのようなメリットをもたらすかについてのケーススタディについては、 リフレクションなしの Jackson のシリアル化 を参照してください。

仮想スレッドのサポート

すべてのライブラリーが、そのままでは仮想スレッドでの使用に適しているわけではありません。 "なぜすべての場所で仮想スレッドを使わないのか?" にその理由が説明されています。

ライブラリーを仮想スレッドで適切に動作させるには、ライブラリーがキャリアースレッドを固定していないことを確認する必要があります。 Quarkus には、これらのチェックを自動的に行うためのテストヘルパー があります。 ディスパッチ作業には、Quarkus によって管理される仮想エグゼキューター を使用する必要があります。WebSockets-next エクステンション は、仮想ディスパッチャーとスマートディスパッチを使用しており、参考にするのに適した例です。

ホットパスパフォーマンスの最適化

Quarkus はエクステンションのパフォーマンスに独自の機会を提供しますが、エクステンション開発者は パフォーマンス最適化の基礎 を忘れてはなりません。

非ブロッキング内部

Quarkus のリアクティブコアは、その優れたスループットとスケーラビリティーに主に貢献します。エクステンションは、独自の内部操作にこのモデルを採用することを検討する必要があります。

Mutiny ベースの API の追加

スケーラビリティーを最大限に高めるには、Mutiny を使用して、リアクティブコアを超えて、完全なリアクティブプログラミングを有効にします。リアクティブプログラミングモデルをサポートするほとんどのプロジェクトでは、 -reactive とプレーンなエクステンションの 2 つの異なるエクステンションが提供されています。 たとえば、 ElasticSearch および ElasticSearch Reactive エクステンションを参照してください。

操作

開発者の満足度は重要ですが、観測可能性、保守性、その他の運用上の考慮事項も重要です。 これらの特性の多くは、Quarkus フレームワークまたは 観測性重視のエクステンション にデフォルトで付属しています。ただし、エクステンションではさらに多くのことが可能になります。

ロギング

Quarkus は、ロギングエンジンとして JBoss Logging を使用し、複数のログ記録 API をサポートしています。(これは通常の Java ロギングであり、OpenTelemetry ログ記録ではありません。)

通常の動作に影響しない状況では、エラーや警告を使用しないでください。これらの出力は、ユーザー監視システムで誤報を引き起こす可能性があります。

ヘルスエンドポイントの定義

エクステンションでは、そのエクステンションに固有のヘルス基準について ライブラリー固有のエンドポイントを定義 する必要がある場合があります。新しいエンドポイントを追加するには、エクステンションで NonApplicationRootPathBuildItem を生成する必要があります。

コンテキストの追跡

エクステンションを使用するアプリケーションの OpenTelemetry 出力に、適切に定義されたスパンが含まれているかどうかをテストする必要があります。スパンが適切なトレース ID で作成されるようにするには、追加の作業が必要になる場合があります。 たとえば、リアクティブな内部構造を持つエクステンションは、正しいコンテキスト伝播のために 重複したコンテキスト をサポートする必要があります。

高度な Kubernetes とコンテナーの統合

Quarkus は Kubernetes ネイティブランタイムとして設計されています。 エクステンションは、Kubernetes とのライブラリー固有の統合ポイントを追加することで、この思想を確保できます。 Kubernetes ネイティブであることは、コンテナーネイティブであることを意味します。少なくとも、エクステンションは常にコンテナー内で適切に機能する必要がありますが、エクステンションにはコンテナースタックの下位レベルと統合する機会もあります。

関連コンテンツ