こんにちは、ツカノ(@snuffkin)です。
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です。
という訳で、今回は、強力なパワーを持ったプロダクトであるにも関わらず、日本ではあまり利用されていないように見えるCamelを紹介します。
Camelとは?
システム統合のベストプラクティスをパターン化したものが、Enterprise Integration Patternsとして定義されており、書籍も出版されています。
- 作者: Gregor Woolf, Bobby Hohpe
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2003/10/10
- メディア: ハードカバー
- 購入: 2人 クリック: 19回
- この商品を含むブログ (8件) を見る
分厚くて、お固い雰囲気の本ですが、ご心配なく。Camelで実現できるパターンは、以下のページに図と共にまとまっています(^^)
Apache Camel: Enterprise Integration Patterns
Camelを使うと、「別システムからのリクエストを受け付け、一旦キューに入れて、取り出した所で並列実行する」といったことが簡単にできます。個々のパーツを組み合わせて処理の流れを作るため、リクエストを受け付ける部分を、定期的に情報を取得しに行く処理に変更することもできます。また、並列実行する部分をラウンドロビンで割り当てたり、キーのハッシュ値で振り分けたり、なんてこともできます。よく利用する処理の流れは大抵サポートしています。
先ほど「別システムからのリクエスト」と書いたような、OSSのプロダクトにアクセスしたり通信を行う処理を、Camelでは「コンポーネント」という概念で実現しています。
Camelの素晴らしいところは、豊富なコンポーネントが用意されており、現在も日々増加中であるところです。Camelのコンポーネント一覧を見ると、100以上のコンポーネントが用意されており、冒頭で紹介したOSSに関するコンポーネントも、ほとんどは既に存在するか開発予定になっています。
FTPやSSH、HTTP(S)といった昔からある通信プロトコルや、AWSヘのアクセス、ビッグデータやNoSQL関連プロダクトとの通信、FacebookやTwitterへのアクセス等、様々なコンポーネントが用意されています。
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のコードが作られますが、それは置いといて以下のコードを書いてみましょう。
- HelloWorld.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の情報はあまり多くありませんが、以下のサイトが参考になると思います。
- 日本Apache Camelユーザ会 Wiki - 日本Apache Camelユーザ会 - SourceForge.JP
- Camel In Action の1章の適当邦訳 〜Apache Camel その1 - A Memorandum (これはシリーズものになってます)
「Camel in Action」はManning Publicationsから発売されています。
- 作者: Claus Ibsen,Jonathan Anstey,Gregor Hohpe,James Strachan
- 出版社/メーカー: Manning Pubns Co
- 発売日: 2010/11/28
- メディア: ペーパーバック
- この商品を含むブログを見る
さて、どうでしたか。次回はCamelのコンポーネント周りについて、紹介します。それではまた~
Acroquest Technologyでは、キャリア採用を行っています。
- 日頃勉強している成果を、Hadoop、Storm、NoSQL、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
- 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
- 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
- OSSの開発に携わりたい。
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
キャリア採用ページ