Storeを作ったのように、TXを使ったThriftの紹介などが出てきたりしたのでそろそろ自分でも試したいなあと思い、試しました。先に結論を言っておくとThrift、とても気に入りました。簡単に処理用の専用サーバをたてることができて、かつ簡単にクライアントから処理要求が送れます。ボクは今まではRESTFulな感じでhttpでこのタスクをやっていたのですが、RESTFulな専用サーバをたてるのは結構開発コストがかかるんですよね。その点で、Thriftは開発コストはとても落ちると思うのでとても気に入っています。なんといって言語バインディングを自動で生成してくれるのは本当に開発コストが落ちますね。Thriftを使うモチベーション文書の自動分類とかを分類器にさせる場合、分類をリアルタイムに高速にやりたい場合があります。そんなときは分類器サーバはいくつかに分散されていることが望ましいし、ウェブアプリケーションから簡単に分類ができるようにしたいですね。そのために上記で述べたように、僕はRESTFulな環境をよく構築してhttp経由で処理していたりしていたんですね。適当ではあるのですが、以下にその概要図を示します。この場合だとクライアントはperlスクリプトで書かれていて、http経由で分類の要求をするためにLWPなどを使います。これはこれで、高速だし使い勝手もなかなかよいのだけど、サーバーサイドのCGIプログラミングは結構チューニングが必要だったり、クライアントプログラムは言語によって複数実装しなければならなかったりと、開発コストが結構かかります。そこで、Thriftを使うと以下の図のようになるんですね。何が楽になったかというと、サーバサイドも、クライアントサイドも基本的にはThriftがプログラムを生成してくれるんですね。通信部分を実装する際にRESTの場合だとCGIなどを自分で書かなくてはいけなかった部分を、ThriftではThriftで定義されたプロトコルを使うように自動的にプログラムを生成してくれるのがありがたいです。クライアントのバインディングも図に示したように多様に対応してくれるんですね。クライアントプログラムは対応している言語が多ければ多いほど利便性は上がると思いますし、これはたまらんです。バインディングのある、ないは喧嘩の種にもなっちゃいますしね!Thriftの簡単な使い方で、何がすごいって本当にすごく簡単にできちゃうんですね。例として以下にThriftを使った簡単な「足し算」と「引き算」のサーバを作る例をしめします。実は簡単な使い方は他のブログで懇切丁寧に説明されているので、わかりやすかった説明を引用させていただきながら説明します。間違えなどがあったらごめんなさい!ThrifのインストールThriftのインストールはUbuntuであれば以下のエントリーの内容に従えばできます。http://d.hatena.ne.jp/conceal-rs/20081116/1226838725fedoraでも試しましたが、基本的にはC++の開発環境が入っていれば問題なくコンパイルできました。自分の環境ではruby-devが入っていないと、怒られました。ruby-devで簡単に探せます。インストールが完了したら、「足し算、引き算」プログラムの作り方を順に説明します。thriftファイルの作成thriftファイルにはサーバーサイドのプログラムに定義される関数のインターフェースのようなものを書きます。これをもとにサーバのスケルトンをThriftが生成するようです。param2)}引数には引数番号を指定します。書式は例に示した通りです。boolなども使えるようです。intは定義されていないと怒られました。定義していないのかわかりません。追記インターフェースで使えるデータ型は以下のものらしいですデータ型インターフェース定義で利用できるデータ型は以下のとおりです。引用intはixxになっているんですね。上記のthriftファイルを元にスケルトンを生成します。TinyCalc_types.hgen-cppには上記のようなスケルトンが生成されていると思います。サーバプログラムを用意しましょう。TinyCalc_server.cppTinyCalc_server.cppがサーバサイドのインターフェースのプログラムとなります。以下の部分を修正します。}ちゃんとthriftファイルに書いたように、sumとsubtractのスケルトンが生成されていますね!修正は関数の中身を実装するだけです。}これでサーバプログラムが完成です。プログラムをコンパイルするちゃんとMakefileを書いたほうがいいのですが、今回はプログラムが小規模なので、さんと同じようにコマンドを直接打ってコンパイルしてしまいます。-I/usr/local/include/thriftこれでサーバのインターフェースが完成です。サーバを起動する作成したサーバを起動しましょう。./TinyCal_serverクライアントプログラムを書く今回はperlとrubyのバインディングを生成するように指定しました。perlのクライアントプログラムを書く例を示します。test.pl6-4ちゃんと動いていますね!駆け足の説明となりましたが、このようにとても簡単にできるんですね。最初に説明したTxを使う例の紹介のように、言語処理などの重い処理にはとても有効だと思います。はてなブックマークでもブックマークの自動分類にThriftを使っているようです。そのほかにも形態素解析の専用のサーバを構築してクライアントサーバから呼んだり、クラスタリングなんかでも便利に使えますよね。ここでは日本語文書を分かち書きにする例を示したいと思います。分かち書きにするソフトは僕が作成したtinysegmenterxxを使いますこれは工藤氏が作成した、Javascriptだけで書かれた日本語分かち書きソフトのC++で書いたものです。基本的な流れは上記で説明した、足し算引き算のものと一緒なので重要な部分だけ紹介します。-I/usr/local/include/thrift./JpSegmenter_serverクライアントプログラムの作成ここでも例に従ってperlのクライアントライブラリの例を示します。"$result\n";$transport->close();このプログラムを実行すると以下のような結果が得られます。見学へ行ってきたよ.ちゃんと分かち書きっぽくなっていますね!すごい駆け足な説明になってしまいましたが、Thriftの便利さが伝わったでしょうか。僕個人としては便利すぎてちょっと興奮しています。本当にいろんなプログラムで使いたいですね。今後もThriftを使ってこの手のプログラムを書いたら紹介したいと思いますー。コメントをキャンセルメールアドレスが公開されることはありません。