Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Apache Camel入門(その1 OSSをつなぐOSS)

こんにちは、ツカノ(@)です。
twitterのタイムラインを見ていると、新しいOSSが登場した、という情報が頻繁に流れてきます。何年か前と比べると「仕事で有用なOSS」の増加速度が早まっているように思います。その分、話題だけれどあまり知らないOSSもたくさんあると感じています。今回は、OSS時代の今にフィットしたOSSの紹介です。

様々なOSSを組み合わせて開発する時代

ここ数年、システム開発をする際に複数のOSSを組合せて利用することが一般的になってきています。このブログの最近1年くらいの記事を振り返ってみても、次のようなOSSについて取り上げています。

  • アプリケーション基盤となるフレークワークではSpringやVert.x
  • ビッグデータ関連ではHadoopやStorm
  • 通信関連ではNettyやZeroMQ
  • NoSQLのミドルウェアではInfinispan

例えば、大量のデータをリアルタイムに処理し、さらにスケールさせる必要があるシステムを開発するケースを考えてみます。
何年も前なら、頑張って独自プロダクトで構築していたかもしれません。一例ですが、現在であればOSSを組み合わせて、

  • Nettyで受信する
  • NoSQLプロダクトを参照しつつ、独自ロジックでメッセージ変換
  • Stormに流し込む

という流れで処理することができます。自分でゼロからすべてを開発せずに実現できます。
重要な事なのでもう一回言いますが、複数のOSSを組合せて利用することが一般的になっています。

一方で、各OSS毎にAPIや利用している通信プロトコルが異なっているため、それなりに学習コストもかかります。また、開発期間も短いため、処理の流れを変えることになったり、特定箇所を分散させたりといったケースでも柔軟に対応できる必要があります。

こういった課題を解決してくれるのが、Apache発のOSSであるCamelです。
f:id:acro-engineer:20131125064348p:plain

という訳で、今回は、強力なパワーを持ったプロダクトであるにも関わらず、日本ではあまり利用されていないように見えるCamelを紹介します。

Camelとは?

システム統合のベストプラクティスをパターン化したものが、Enterprise Integration Patternsとして定義されており、書籍も出版されています。

Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions (Addison-Wesley Signature Series (Fowler))

Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions (Addison-Wesley Signature Series (Fowler))

Camelはここで定義された処理のパターンをシンプルに実現するために開発されました。

分厚くて、お固い雰囲気の本ですが、ご心配なく。Camelで実現できるパターンは、以下のページに図と共にまとまっています(^^)
Apache Camel: Enterprise Integration Patterns

Camelを使うと、「別システムからのリクエストを受け付け、一旦キューに入れて、取り出した所で並列実行する」といったことが簡単にできます。個々のパーツを組み合わせて処理の流れを作るため、リクエストを受け付ける部分を、定期的に情報を取得しに行く処理に変更することもできます。また、並列実行する部分をラウンドロビンで割り当てたり、キーのハッシュ値で振り分けたり、なんてこともできます。よく利用する処理の流れは大抵サポートしています。

先ほど「別システムからのリクエスト」と書いたような、OSSのプロダクトにアクセスしたり通信を行う処理を、Camelでは「コンポーネント」という概念で実現しています。
Camelの素晴らしいところは、豊富なコンポーネントが用意されており、現在も日々増加中であるところです。Camelのコンポーネント一覧を見ると、100以上のコンポーネントが用意されており、冒頭で紹介したOSSに関するコンポーネントも、ほとんどは既に存在するか開発予定になっています。
FTPSSH、HTTP(S)といった昔からある通信プロトコルや、AWSヘのアクセス、ビッグデータやNoSQL関連プロダクトとの通信、FacebookTwitterへのアクセス等、様々なコンポーネントが用意されています。

Camelでは、これら処理のパターンやコンポーネントを組み合わせることで、処理の流れを簡単に定義することができます。

Hello, World!

百聞は一見にしかず。さっそく実際にCamelを使ってみましょう。
mavenをインストールしてあれば、アプリケーション開発のひな型を生成できますので、これを利用します。以下のコマンドを実行してください(groupId, artifactId, versionは作成するアプリケーションに合わせて読み換えてください)。

mvn archetype:generate -DgroupId=snuffkingit \
    -DartifactId=camel-example \
    -Dversion=1.0.0-SNAPSHOT \
    -DarchetypeGroupId=org.apache.camel.archetypes \
    -DarchetypeArtifactId=camel-archetype-java \
    -DarchetypeVersion=2.12.1

これで、camel-exampleディレクトリ配下にCamelを利用するためのpom.xml等が作成されました。
ちなみに、Camel関連で用意されているarchetypeは以下のページに一覧があります。
Apache Camel: Camel Maven Archetypes

src/main/java配下に、ひな型のjavaのコードが作られますが、それは置いといて以下のコードを書いてみましょう。

package snuffkingit.camel.example;

import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;

public class HelloWorld {

    public static void main(String... args) throws Exception {
        CamelContext context = new DefaultCamelContext(); // (1)
        context.addRoutes(new RouteBuilder() { // (2)
            @Override
            public void configure() {
                from("direct:foo") // (3)
                .to("log:MyCategory"); // (4)
            }
        });
        context.start();
        context.createProducerTemplate().sendBody("direct:foo", "Hello, World!"); // (5)
    }
}

「Hello, Worldで、どうしてこんなに書かせるんだ!」と思われるかもしれませんが、怒らず最後まで聞いてください^^; もっと実際的な話は次回以降紹介しますが、まずは基本の理解です。
(1) まずは、Camelのコンテキストを初期化します。
(2) 処理の流れをCamelでは「ルート(route)」として定義し、その中を流れる「メッセージ」を処理します。この行では、コンテキストにルートを追加しています。
(3) fromとして、ルートの開始部分を指定します。ここでは開始部分に「direct:foo」という名前を付けています。(この意味の詳しい説明は次回以降行います)
(4) toとして、ルートの行き先を指定します。ここでは、メッセージをログ出力しています。
(5) ルートの開始部分「direct:foo」に"Hello, World!"というメッセージを送ります。

このクラスを実行すると、以下のログが出力されます(デフォルトのログフォーマットなので、ちょっと見づらいかもしれません)。

[                          main] DefaultCamelContext            INFO  Apache Camel 2.12.1 (CamelContext: camel-1) is starting
[                          main] ManagedManagementStrategy      INFO  JMX is enabled
[                          main] DefaultTypeConverter           INFO  Loaded 175 type converters
[                          main] DefaultCamelContext            INFO  StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
[                          main] DefaultCamelContext            INFO  Route: route1 started and consuming from: Endpoint[direct://foo]
[                          main] DefaultCamelContext            INFO  Total 1 routes, of which 1 is started.
[                          main] DefaultCamelContext            INFO  Apache Camel 2.12.1 (CamelContext: camel-1) started in 1.027 seconds
[                          main] MyCategory                     INFO  Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello, World!]
[                          main] DefaultCamelContext            INFO  Apache Camel 2.12.1 (CamelContext: camel-1) is shutting down
[                          main] DefaultShutdownStrategy        INFO  Starting to graceful shutdown 1 routes (timeout 300 seconds)
[el-1) thread #1 - ShutdownTask] DefaultShutdownStrategy        INFO  Route: route1 shutdown complete, was consuming from: Endpoint[direct://foo]
[                          main] DefaultShutdownStrategy        INFO  Graceful shutdown of 1 routes completed in 0 seconds
[                          main] DefaultCamelContext            INFO  Apache Camel 2.12.1 (CamelContext: camel-1) uptime 1.089 seconds
[                          main] DefaultCamelContext            INFO  Apache Camel 2.12.1 (CamelContext: camel-1) is shutdown in 0.017 seconds

横長になっていますので、スクロールしないと見えないかもしれませんが、下から7行目(MyCategoryのところ)の右の方に「Hello, World!」と出ていますね。
「direct:foo」からメッセージが流れ、そのメッセージがログ出力されました。

実は「direct」や「log」というのがCamelのコンポーネントです。「direct」コンポーネントの中をメッセージが流れて行き、「log」コンポーネントがログ出力していたのです。
fromやtoに指定した文字列を替えるだけで様々な処理を行えるのがCamelの大きな魅力です。このあたりは次回のお楽しみです(^^)

参考情報

日本語で読めるCamelの情報はあまり多くありませんが、以下のサイトが参考になると思います。

「Camel in Action」はManning Publicationsから発売されています。

Camel in Action

Camel in Action

  • 作者: Claus Ibsen,Jonathan Anstey,Gregor Hohpe,James Strachan
  • 出版社/メーカー: Manning Pubns Co
  • 発売日: 2010/11/28
  • メディア: ペーパーバック
  • この商品を含むブログを見る


さて、どうでしたか。次回はCamelのコンポーネント周りについて、紹介します。それではまた~
 

Acroquest Technologyでは、キャリア採用を行っています。


  • 日頃勉強している成果を、Hadoop、Storm、NoSQL、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
  • 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
  • OSSの開発に携わりたい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 キャリア採用ページ