Apache Camel 3の注目ポイントTOP 10

Red Hat エンジニアリングの佐藤匡剛です。赤帽エンジニア Advent Calendar 2019 19日目のつもりで書いたのですが、もう書けちゃったのでせっかくなのでフライングで投稿します。

本ブログやRHTN、勉強会などでたびたびお伝えしていた通り、ついに先月11/28にApache Camel 3.0がGAリリースされました! Camel 2.0の登場から、10年ぶりのメジャーアップグレードだそうです。

そういえば、10年前というとオープンソースのEIP実装/ESBといえばまだまだMule ESB、Apache ServiceMixが中心だった頃に、簡潔なDSLで非常に軽量なルーティングエンジンとして登場したCamelが一部で注目を集めつつあったのを思い出します。

Camel 3の注目ポイント(Top 10)

以前のブログでも紹介しましたが、Camel 3の注目ポイントは以下の通りです。

Apache Camel 3 What's New (top 10) - Apache Camel

  1. 3(+ 1)プロジェクトに
  2. Webサイトリニューアル
  3. Java 11サポート
  4. モジュール化されたcamel-core
  5. 起動高速化とフットプリント軽量化
  6. タイプセーフなエンドポイントDSLの導入
  7. ルーティングエンジンのリアクティブ化
  8. 独立したcamel-main JAR
  9. MicroProfile対応
  10. 様々な機能改善
  11. マイグレーションガイド

今回は、それぞれの注目ポイントを詳しく解説していきます。

なお、本記事はClaus Ibsenによる上記英文記事の翻訳ではなく、私なりに噛み砕いた紹介記事なので、興味のある方は英文記事の方も読んでみることをオススメします。

1. 3(+ 1)プロジェクトに

Camel 2まではSpring BootとKarafのランタイムサポートも含めたすべてのライブラリが1プロジェクトでリリースされてきましたが、Camel 3以降はCamel KCamel QuarkusがApache Camelの正式なサブプロジェクトとして加わり、3プロジェクト体制になります。

https://camel.apache.org/blog/Camel3-Whatsnew/camel3-projects.png
https://camel.apache.org/blog/Camel3-Whatsnew/ より)

  • Camel 3 ― Apache Camelの中心ライブラリで、これまでのCamel 2と同じくあらゆるJavaアプリケーションで使えるインテグレーションフレームワーク。Camel K、Camel QuarkusはCamel 3をベースとする。
  • Camel K ― CamelをKubernetes / Knative上で使えるようにするためのプロジェクト。クラウドベースのランタイムとインテグレーションOperatorを含む。
  • Camel QuarkusQuarkusのCamelエクステンション。ネイティブコンパイルした超高速Camelアプリケーションが実行可能になる。

Camel KとCamel Quarkusの役割分担が多少分かりにくいですが、Camel QuarkusはCamelランタイム自体の超高速化、Camel KはCamelアプリケーションをクラウドネイティブにするためのOperator、という位置付けです。両者は競合するものではなく相互に連携し合います。ゆくゆくは、たとえばクラウドネイティブ(Camel K)かつネイティブコンパイルされた超高速なランタイム(Camel Quarkus)で動くCamelアプリケーション、といったものが近いうちに実現できるかもしれません。

なお、3.0リリース時点ではまだプロポーザル段階でしたが、camel-kafka-connectorも今後、正式にサブプロジェクトに加わりそうです。したがって、最終的には「3(+ 1)」プロジェクト体制に生まれ変わります。

2. Webサイトリニューアル

今ではイケてるオープンソースプロジェクトはWebサイトもモダンでカッコいいのが当たり前になっていますが、Camel 2.xまでは2000年代の古くさいApacheなWebサイトのままでした。3.0リリースを機に、ようやくWebサイトもモダンに生まれ変わりました。

camel.apache.org

個人的なオススメは、新しくなったCamelコンポーネントレファレンスです。Camelといえば300+あるコンポーネントによって色々な外部システムと連携できるのが一番の売りですが、そのコンポーネントリストが非常に参照しやすくなりました。

List of Camel components - Apache Camel

特に注目してほしいのが、この左メニューの上の "Quick lookup" 検索窓です。これで300+の中から、探したいコンポーネントを一瞬で見つけられます!

f:id:tasato-redhat:20191211170005p:plain:w700

あともう1つ忘れてはいけないのが、Webサイトの各ページに "Edit" ボタンが付いたことです。Editボタンをクリックするだけで、GitHubの該当するソースに直接飛んで、そのままGitHub上で修正をプルリクできます。コミュニティへのコントリビューションの敷居がいっそう低くなりましたので、ぜひどんな小さなタイポでも見つけたらコントリビュートしてみてください!

私もこういう超細かい修正をちょくちょくコントリビュートしています。

3. Java 11サポート

Camel 3.0がJava 11を正式にサポートする最初のバージョンになります。

Java 8も当分の間はCamel 3.xでサポートされますが、Camel 2.xから3.xへマイグレーションするための補助、という位置付けなので、Java 8のEOLに合わせて将来の3.xバージョンではいずれサポートが外されることになります。

4. モジュール化されたcamel-core

Camelクラウドネイティブ化の一環でアプリケーションのフットプリントを軽量化するため、camel-coreのリファクタリング(さらに細かいJARへの分割)が行われました。このモジュール化によって、Camel 3からは本当に必要な依存JARだけをパッケージできるようになります。

細かい話は、古市さんの翻訳記事に書かれています。

rheb.hatenablog.com

Camelユーザの観点で大事なのは、camel-apicamel-supportcamel-core-engineの3つです。

  • camel-api ― Camelの基本的なAPI(CamelContextEndpointExchangeMessageなど)が含まれます。
  • camel-support ― Camel APIの基本実装クラスが提供されます。
  • camel-core-engine ― Camelルートエンジンの実装です。

なお、Clausの英文記事にはRouteBuildercamel-supportに含まれると書いてあるのですが、見たかぎりRouteBuildercamel-core-engineに含まれています。

このモジュール化で大事なポイントの1つは、これまで組み込みコンポーネントとしてcamel-coreに同梱されていたDirectLogなどの基本コンポーネントもすべて外だしされたことです。

  • camel-bean
  • camel-log
  • camel-stub
  • camel-browse
  • camel-mock
  • camel-timer
  • camel-controlbus
  • camel-properties
  • camel-validator
  • camel-dataformat
  • camel-ref
  • camel-vm
  • camel-direct
  • camel-rest
  • camel-xpath
  • camel-directvm
  • camel-saga
  • camel-xslt
  • camel-file
  • camel-scheduler
  • camel-zip-deflater
  • camel-language
  • camel-seda

これからは、本当に必要なコンポーネントだけを使って可能な限り軽量にCamelアプリケーションを作っていくのが推奨スタイルになります。

もちろん、救済措置として本当にミニマルなcamel-core-engineの他に、上記基本コンポーネントを含んだ「レガシー」なcamel-coreも提供されます。Camel 3の軽量なスタイルへ書き換えるまでの移行措置として、この従来型camel-coreを使うことができます。

5. 起動高速化とフットプリント軽量化

camel-coreモジュール化の結果として、メモリにロードされるクラスの数が削減されました。Clausの英文記事によれば、Camel 2では5200クラスロードされていたのがCamel 3では4300に減ったそうです。

それに加えて、リフレクションで実装されていた箇所を静的コード生成で置き換えるという最適化も行われています。これはCamel Quarkusの取り組みとも連動しているのですが、リフレクションを使わないことでプログラム起動の高速化を図るとともに、Quarkusでネイティブコンパイル可能にもしています。

6. タイプセーフなエンドポイントDSLの導入

個人的にCamel 3単体での一番の売りはここかなと思っています。Java DSLメインでCamelを使っている方は、すぐにCamel 3を試してみたくなるのではないでしょうか。

「タイプセーフ」なエンドポイントDSLというのは、要するに従来のテキストベースのtimer:click?period=3000&fixedRate=trueといった定義でなく、URIのパラメータも含めてメソッドチェーンでエンドポイントを定義できるDSLのことです。

テキストベースではパラメータ名が間違ってないか、パラメータの値の型(intなど)が正しいか、といったことを厳密にはコンパイル時にチェックできませんでした。

from("timer:click?period=3000&fixedRate=true")
    .to("seda:foo?blockWhenFull=true");

メソッドチェーンのDSLになることで、Javaのコンパイル時型チェックでそういったエラーを検査できるようになります。

from(timer("click").period(3000).fixedRate(true))
    .to(seda("foo").blockWhenFull(true));

エンドポイントDSLを使うには、pom.xmlのdependencyにcamel-endpointdslを追加し、RouteBuilderの代わりにEndpointRouteBuilderを使ってルートを定義します。

return new EndpointRouteBuilder() {
    @Override
    public void configure() throws Exception {
        from(timer("click").period(3000).fixedRate(true))
            .to(seda("foo").blockWhenFull(true));
    }
};

サンプルプロジェクトは以下を見てみてください。

7. ルーティングエンジンのリアクティブ化

内部実装の話で今のところユーザには直接影響ないですが、ルーティングエンジンがリアクティブに書き換えられました。実際のところ、数年前にCamel 3の計画が立てられていた時点ではこのリアクティブ化が目玉機能になる予定だったのですが、実際に蓋を開けてみると約束通りこの目標が達成はされたものの他の注目機能に比べて地味な位置付けになっています。

私も実際にどうリアクティブに書き換えられたのかまだ追えていないのですが、おそらくはスレッドを使わなくなることでリソース消費が効率的になる他に、今までのスレッドベースのエンジンではルート内で例外が発生した際にスタックトレースが冗長になっていたものがより短く簡潔になる、などの恩恵がある(はず)です。

あと、ゆくゆくはJava 8のサポートが終了してJava 11が前提になった段階で、Camel APIにJava 9 Flow APIをベースにしたリアクティブなクライアントAPIを導入する構想があります。

8. 独立したcamel-main JAR

地味な機能追加ですが、Spring BootやKarafなどのランタイムなしにスタンドアローンでCamelアプリケーションを実行しやすいように、camel-mainライブラリが外だしされました。これもクラウドネイティブ化の一環で、アプリケーションに不必要なランタイムの依存をなるべく取り除いていこうという方向性にあるものです。

実際の使用サンプルについては、以下を見てみてください。

9. MicroProfile対応

Camelのマイクロサービス対応の流れで、Eclipse MicroProfileとの連携も進められています。具体的には、MicroProfileの設定、メトリクス、ヘルスチェック、耐障害性などをサポートしたコンポーネントが新たに作られました。これらのMicroProfileコンポーネントはCamel Quarkusにも対応しています。

10. 様々な機能改善

Camel 3.0にはその他にも細かな修正や機能改善がいっぱい入っています。Clausの英文記事で言われている点を箇条書きするとこんなところです。

  • JUnit 5サポート
  • Camel Registryが書き込み可能になってテストで使いやすくなった
  • プロデューサーエンドポイントの遅延初期化が可能に
  • Camel Supervising Route Controllerによるルート起動時のより細やかな管理

11. マイグレーションガイド

Top 10といいつつ11個目があるのはご愛嬌です。もともとはこのCamel 2.x → 3.0マイグレーションガイドの紹介で記事を書こうと思っていたのですが、まずはCamel 3の注目ポイント紹介だけで十分お伝えすべきボリュームがあったので、予定を変更してこの記事を書きました。

Camel 3はなるべく後方互換性を尊重しつつ作られているとはいえ、10年ぶりのメジャーアップグレードなので、技術的負債の返済も含めて変わるべきところは変わっています。お手元のCamel 2.xアプリケーションを3.0にアップグレードするには、このマイグレーションガイドに沿ってプロジェクトを修正していく必要があります。

Apache Camel 2.x to 3.0 Migration Guide - Apache Camel

このガイドの紹介は年明けにでも書こうと思っているので、ご期待ください。

それでは、新しくなったCamel 3でラクダ乗りを楽しみましょう!

f:id:tasato-redhat:20191213174408j:plain:w600
(クラウドへ向かうラクダのイメージ)― Photo by Federico Gutierrez on Unsplash

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。