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

Versatility

The client-server architecture has been the de-facto standard for building applications for years. But a significant shift happened. The one model rules them all age is over. A new range of applications and architectural styles have emerged and transformed how code is written and how applications are deployed and executed. HTTP microservices, reactive applications, event-driven architecture, function as a service, and AI-infused applications are now central players in modern systems.

Quarkus は、この新しい世界を念頭に置いて設計されており、これらのパラダイムに対する第一級のサポートを提供します。 これは、Quarkus でモノリスを構築できないという意味ではありません。スムーズに構築できます。 それどころか、Quarkus 開発モデルは、モノリス、マイクロサービス、CLI、イベント駆動型アプリケーション、関数、Kubernetes オペレーターなど、開発中のアプリケーションの種類に合わせて変化します。

HTTPマイクロサービス

まずは基本から始めましょう。HTTP マイクロサービスです。HTTP エンドポイント (REST と呼ばれることが多い) を開発する必要があります。 受信した HTTP リクエストを処理するには、通常、データベースや他の HTTP サービスなどの他のサービスに依存する必要があります。 周期表要素 を処理する非常に単純なアプリケーションを見てみましょう。

Quarkus REST と Hibernate ORM with Panache を使用すると、コードは次のようになります:

Using Quarkus REST
@Path("/elements")
public class ElementResource {

   @GET
   public List<Element> getAll() {
       return Element.listAll();
   }

   @GET
   @Path("/{position}")
   public Element getOne(int position) {
       Element element = Element.find("position",
             position).firstResult();
       if (element == null) {
           throw  new NotFoundException();
       }
       return element;
   }

   @POST
   @Transactional
   public Response create(Element element) {
       element.persist();
       return Response.ok(element).status(201).build();
   }

   //...
}
Spring MVC互換性レイヤー
@RestController
public class ElementController {


   @GetMapping("/elements")
   public List<Element> getAll() {
       return Element.listAll();
   }


   @GetMapping("/elements/{position}")
   public Element getOne(int position) {
       Element element = Element.find("position",
             position).firstResult();
       if (element == null) {
           throw new ResponseStatusException(NOT_FOUND);
       }
       return element;
   }


   @PostMapping("/elements")
   @Transactional
   public Response create(Element element) {
       element.persist();
       return Response.ok(element).status(201).build();
   }


   //...
}

Java EE または Spring ユーザーであれば、この開発モデルはおなじみのはずです。 さまざまなリクエストを処理するために、@GET@POST でアノテーションされたメソッドを含むリソースを公開します。 Quarkus は Spring API との互換性レイヤー も提供しているため、@GetMapping@RestController も使用できます。

JPA エンティティ マネージャーを直接使用できます。 また、定型句を削除し、アクティブレコードまたはリポジトリ モデルを公開する代替手段である Panache を使用することもできます。 Panache を使用すると、 Element クラスは次のように単純になります。

@Entity
public class Element extends PanacheEntity {

   public String name;
   public String symbol;
   @Column(unique = true)
   public int position;
}

マイクロサービスはシステムに組み込まれる傾向があります。 別の HTTP エンドポイントにアクセスする必要があると仮定しましょう。 低レベル HTTP クライアントを直接使用できます。これは定型コードを繰り返すだけです。 Quarkus は、https://quarkus.io/guides/rest-client[MicroProfile Rest Client API] を使用して HTTP エンドポイントを簡単に呼び出す方法を提供します。 まず、次のようにサービスを宣言します。

@RegisterRestClient(configKey="element-service")
@Path("/elements")
public interface ElementService {

   @GET
   @Path("/{position}")
   Element getElement(int position);
}

メソッドを追加し、アノテーションを使用して、実行する各呼び出しの動作を記述するだけです。 次に、リソース/コントローラーで、ElementService インターフェイスを使用します。

@RestClient ElementService service;
public void invokeRemoteService() {
   Element element = service.getElement(1);
}

URL はコード内にはないので、どこで設定されるのか疑問に思うかもしれません。 URL は環境に依存する可能性が高いため、ハードコードしないでください。 URL はアプリケーション構成で設定されます。

quarkus.rest-client.element-service.url=http://localhost:9001

URL は、システム プロパティまたは環境変数を使用して、デプロイ中または起動時に更新できます。 サービスの検出と選択 を使用することもできます。 Quarkus は HTTP に限定されません。 マイクロサービス分野では、https://quarkus.io/guides/grpc-getting-started[gRPC] または GraphQL という 2 つの主要な代替手段を使用できます。

リアクティブであること

アプリケーションの要件は、ここ数年で劇的に変化しました。 リアクティブ アーキテクチャは、クラウド コンピューティング、ビッグ データ、IoT の時代にアプリケーションが成功するための、ますます好ましいアプローチになりつつあります。 今日のユーザーは、応答時間が数ミリ秒、稼働率が 100%、レイテンシが低い、プルではなくプッシュ データ、スループットが高く、回復力と弾力性があるアプリケーションを採用しています。 ただし、これらの機能は、リソース、インフラストラクチャ、ツールにかなりの投資をしなければ、従来のソフトウェア アーキテクチャを使用して実現することはほぼ不可能です。 世界は変化しており、数十台のサーバー、長い応答時間 (> 500 ミリ秒)、メンテナンスや障害の滝によるダウンタイムでは、期待されるユーザー エクスペリエンスを満たせません。 私たちは、より優れた 分散システムを構築する必要があり、それが リアクティブ システム のモットーです。

Quarkus は、リアクティブ システムを構築する道程を支援します。 Quarkus は、 リアクティブコア に基づいています。 すべての Quarkus アプリケーションはリアクティブ アプリケーションです。 システム リソースを効率的に使用し、大きなスループットを処理できます。 ただし、コードでリアクティブ プログラミングを使用する必要はありません。 プレーンな命令型コード、仮想スレッドを使用する命令型コード、リアクティブ コードの 3 つの選択肢を組み合わせて使用​​できます。 要件に応じて、いずれか 1 つを選択するか、または組み合わせることもできます。

命令型
@Path("/elements")
public class ElementResource {

   @GET
   public List<Element> getAll() {
       return Element.listAll();
   }
}
リアクティブ
@Path("/elements")
public class ReactiveElementResource {

   @Inject
   ElementRepository repository;

   @GET
   public Uni<List<Element>> getAll() {
       return repository.listAll();
   }
}
仮想スレッド
@Path("/elements")
@RunOnVirtualThread
public class ElementResource {

   @GET
   public List<Element> getAll() {
       return Element.listAll();
   }
}

イベント駆動型アーキテクチャ

しかしながら、HTTP の特性により、すべてのコンポーネントが非同期メッセージ パッシングを使用して対話する完全な リアクティブ システム を実装することはできません。 Apache Kafka、Apache Pulsar、RabbitMQ などのさまざまなブローカーからのメッセージを消費し、これらのメッセージをスムーズに処理できます。

@ApplicationScoped
public class MeasurementProcessor {

   @Inject
   LocationRepository repository;

   @Incoming("raw-measurement")
   @Outgoing("temperatures")
   public Record<String, Temperature> process(Measurement m) {
       var location = repository
               .getLocationForDevice(m.device());
       var outcome = new Temperature(location, m.temp());
       return Record.of(location, outcome);
   }

}

@Incoming および @Outgoing アノテーションは、https://www.smallrye.io/smallrye-reactive-messaging[Reactive Messaging] の一部です。 これらは、どの channel から消費し、どの channel に送信するかを表現するために使用されます。 SmallRye Reactive Messaging のおかげで、HTTP、Pulsar、Kafka、RabbitMQ、JMS、http://camel.apache.org/[Apache Camel] などのさまざまなブローカーやトランスポートとの間でメッセージを消費および送信できます。

前述のように、実行モデルは、命令型 (上記のような)、リアクティブ型 (ストリーム操作を含む Mutiny API を使用)、仮想スレッドの 3 つから選択できます。

命令型メッセージ処理
@Incoming("raw-measurement")
@Outgoing("temperatures")
public Record<String, Temperature> process(Measurement m) {
   var location = repository
           .getLocationForDevice(m.device());
   var outcome = new Temperature(location, m.temp());
   return Record.of(location, outcome);
}
リアクティブ型メッセージ処理
@Incoming("raw-measurement")
@Outgoing("temperatures")
public Uni<Record<String, Temperature>> process(Measurement m) {
   return repository.getLocationForDevice(m.device())
           .map(location -> Record.of(location,
                   new Temperature(location, m.temp())
           ));
}
ストリーム処理
@Incoming("raw-measurement")
@Outgoing("temperatures")
public Multi<Record<String, Temperature>> transform(Multi<Measurement> stream) {
   return stream
           .onItem().transformToUniAndMerge(m ->
             repository.getLocationForDevice(m.device())
                 .map(location -> Record.of(location,
                   new Temperature(location, m.temp())
                 )
             )
       );
}
仮想スレッドを用いたメッセージ処理
@Incoming("raw-measurement")
@Outgoing("temperatures")
@RunOnVirtualThread
public Record<String, Temperature> process(Measurement m) {
       var location = repository
               .getLocationForDevice(m.device());
       var outcome = new Temperature(location, m.temp());
       return Record.of(location, outcome);
}

Functions as a Serviceとサーバーレス

Quarkus は起動時間が短く、メモリ使用量が少ないため、サーバーレス環境で関数を実装できます。 Quarkus は、AWS Lambda、Azure Functions、Knative、Knative Events (Cloud Events) などのさまざまな FaaS 環境にデプロイ可能な関数を作成するためのアプローチである Funqy を提供します。 また、スタンドアロン サービスとしても使用できます。 Funqy では、関数は次のようになります。

import io.quarkus.funqy.Funq;

public class GreetingFunction {
    @Funq
    public String greet(String name) {
       return "Hello " + name;
    }
}

関数内で Quarkus のあらゆる機能を使用でき、高速起動とメモリ使用量の低さのメリットを享受できます。 Quarkus を使用すると、プログラミング言語を変更せずにこの新しい世界を取り入れることができます。 パッケージ化とデプロイは簡単です。 Quarkus は、ターゲットとする環境に合わせてパッケージ化を調整します。

AI搭載アプリケーション

近年、AI はニッチな技術から IT における最も変革的なイノベーションの 1 つへと進化しました。 大規模言語モデルの台頭により、よりインテリジェントでパーソナライズされた適応型アプリケーションを構築する新たな機会が開かれました。 予測型および生成型 AI モデルは、よりスマートなユーザー エクスペリエンスの提供、意思決定の自動化、生産性の向上を目的として、ますます統合されています。 ただし、AI を組み込んだアプリケーションの開発には課題がないわけではありません。 これらのモデルは非決定論的であることが多く、同じ入力に対して異なる出力を生成する可能性があります。 また、モデルが不正確または無意味な結果を生成する幻覚などの動作を示すこともあります。 さらに、AI システムは意図的または偶発的な誤用に対して脆弱であり、プライバシー侵害、セキュリティ リスク、または偏った結果につながります。

これらの複雑さに対処するために、開発者は AI を活用したアプリケーションが堅牢かつ安全であることを保証する必要があります。 これには、予測できない動作を処理するメカニズムの実装、入力の検証とサニタイズ、潜在的な問題の出力の監視、コンプライアンスと透明性のための AI のやり取りの監査が含まれます。

Quarkus は、AI を組み込んだアプリケーションを構築するためのシームレスなソリューションを提供します。 AI モデルとの通信を自動的に管理し、入力と出力が適切に保護され、処理されるようにします。 Quarkus には、組み込みの監査機能と監視機能も用意されています。

@RegisterAiService(retrievalAugmentor = MovieMuseRetrievalAugmentor.class)
@SessionScoped
public interface MovieMuse {

   @SystemMessage("""
           You are MovieMuse, an AI answering questions about
           the top 100 movies from IMDB.
           Your response must be polite, use the same language
           as the question, and be relevant to the question.
           Don't use any knowledge that is not in the
           database.
           """)
   String chat(@UserMessage String question);
}

Quarkus を活用することで、安全性、信頼性、業界標準への準拠を維持しながら、インテリジェントで最先端のアプリケーションの提供に集中できます。

連続性

Quarkus のコア原則は、従来のモノリスからクラウドネイティブのサーバーレス アーキテクチャまで、事実上あらゆるタイプの最新アプリケーションを開発者が構築できるようにする多用途の基盤を提供します。 その柔軟性により、あらゆる規模と複雑さのアプリケーションに最適であり、組織は進化するビジネス ニーズとテクノロジ ランドスケープに適応できます。 Quarkus の際立った機能の 1 つは、リアクティブ コアです。これにより、アプリケーションは今日の最も要求の厳しい課題を驚くほど効率的に処理できます。 Quarkus は、リソースの使用を最適化することで、インフラストラクチャ コストを最小限に抑えながら、高負荷下でもアプリケーションをシームレスに拡張できるようにします。 フレームワークは命令型プログラミング モデルとリアクティブ プログラミング モデルの両方をサポートしているため、開発者はプロジェクトの特定の要件に基づいて適切なアプローチを自由に選択できます。 この柔軟性により、リアルタイム イベントに反応し、非同期ワークフローを簡単に処理できる高性能アプリケーションを作成できます。

加えて、Quarkus は、幅広いプロトコルや通信スタイルとやり取りする能力に優れています。 アプリケーションがレガシー システム、マイクロサービス、または新興のクラウド テクノロジーに接続する必要がある場合でも、Quarkus はスムーズな統合とやり取りを促進し、ソリューションの全体的な適応性を高めます。 イベント駆動型アーキテクチャ、RESTful API、gRPC、およびその他の最新プロトコルをサポートしているため、Quarkus を搭載したアプリケーションは、分散型およびダイナミックな環境で十分に機能するようになります。

つまり、Quarkus は堅牢で効率的なフレームワークであるだけでなく、今日の急速に変化するデジタル世界において、多様でスケーラブルで回復力のあるアプリケーションを構築するための将来を見据えたソリューションでもあります。 リアクティブ・コア、適応性の高い開発モデル、幅広いプロトコル サポートを備えた Quarkus は、現代のアプリケーション開発の多様で増大する需要を満たすために必要なツールを提供します。