たごもりすメモ

コードとかその他の話とか。

OSS CEP Server 'Norikra' v0.0.1 released!

みんな大好きFluentdはプラグインも自由に書けて好き放題にリアルタイム集計を行うことが可能なわけですが、やりたい処理にあわせて無限にプラグインを書き続けてるとプラグインの数が爆発し何がどんな処理をしているのかもよくわからず混乱の海に呑まれて消えるという未来がみなさんの脳裏にもおそらく想像されていることと思います。

で、世の中にはCEPエンジンというものがあってストリーム状に流れてくるイベントデータに対して処理を行う仕組みがあるわけですね。これ使いたい! しかもあれだ、簡単に処理が書けるものがいい!
何が言いたいかと言うとWE NEEEED xQL!!!!!!!!!!!!!!!

そんなようなことをこちらのエントリを書いたときに思ったわけです。
http://tagomoris.hatenablog.com/entry/2013/02/19/142017

で、RubyKaigiにも通っちゃったことだし作りました。その名も Norikra 。

https://github.com/tagomoris/norikra
https://github.com/tagomoris/norikra-client

https://rubygems.org/gems/norikra
https://rubygems.org/gems/norikra-client

きわめて簡単に言うと、以下のようなフィールドの有無が不揃いな一連のデータ('www'というラベルがついているとする)に対して

status:301  bytes:48  path:/  referer:http://www.yahoo.co.jp/
status:200  bytes:1024  path:/index.html  referer:
status:200  bytes:302113  path:/search  query_q:word1  query_order:date  query_show:30
status:200  bytes:3012  path:/dir/x.jpg  referer:/index.html

以下のように各々のレコードのフィールドを有無を気にせず、自由にSQL-likeなクエリを発行できます。10秒毎の数字をとったり分毎の数字をとったり時間毎の数字をとったり、タイムウィンドウの指定も自由自在です。

SELECT count(*) AS pv FROM www.win:time_batch(10 seconds) WHERE status=200
SELECT count(*) AS redirects FROM www:time_batch(1 minutes) WHERE status=301
SELECT count(*) AS searchs FROM www:time_batch(1 hours) WHERE query_q.length() > 0 AND path='/search'

どうだ超便利そうでしょ!

Norikraってなに?

Esperを駆動しRPCで外からクエリの登録やデータの投入・結果データのフェッチが可能なサーバです。JRubyを使っており、単独のプロセスとして動作します。以下主な機能。

  • 「ターゲット」という単位でイベントデータおよびクエリ実行対象を抽象化
    • データのフィールド有無をNorikraが隠蔽することにより気楽なクエリの記述を実現
    • クエリが必要とするフィールドを持っているデータだけが自動的にクエリの対象になる
    • 語ると長いが生のEsperだとこれができない
  • クエリからの出力データのプール
    • 好きなタイミングでクライアントからフェッチすれば、イベント発生時刻つきのデータがとれる
    • tail -f的なRPCも作りたい

まだ絶賛開発中、というかマトモな長時間マトモな量のトラフィックに対して動かしたり全然してないので今すぐ突撃するのは地雷を踏みたいあなたにしかお薦めしません。マトモなロギングとかマトモなdaemonizeとかシグナルハンドリングとか、単独のサーバとしてもあれこれ足りてないので。
現状はあくまで、RubyKaigi 2013あわせでとにかく出した、という側面が強いのは否定しません。かなしい。

とはいえ、CEPサーバとして使えるものは他にロクに見た覚えがない、か、プロプライエタリで超お高い、か、だと思います。そういう意味でこのソフトウェアの価値はかなりあると信じてるので、ちゃんと使うつもりだし、ちゃんと使えるようにブラッシュアップするつもりです。

FAQ

なんでJRuby

Javaはちょっと。

分散処理できるの?

いまはできません。クエリをparseして集計関数とかをくくりだして、各ノードに分散したイベントの集計結果をさらにどこかで集計しなおして、みたいなロジックが必要になるなあとか考えてはいますが、だいぶたいへん。そのうちやるかも。やらないかも。

Esperのフル機能使えるの?

使えません。JOINとかやると死にます。Esperの超広大無辺なフル機能を使えるようなツールを作るより、まずは単純な集計を超便利に実行できるもの、を目指してます。

どう考えても Fluentd と繋ぐべきだと思うんだけどお前なんなの?

まあもうちょっと待ってろや。もしくは RubyKaigi 2013 に来なさい。3日目、6月1日な。