about thrift
TRANSCRIPT
Thrift
Naoya Itonaoya at hatena ne jp
Thrift
クロス言語 RPC フレームワーク http://developers.facebook.com/thrift/ http://incubator.apache.org/thrift/
Thrift が使える場面
検索サービス開発 C++ でインデクサ、エンジン
" 整数を bit 単位で圧縮 " な世界に LL は使いづらい
Perl や PHP でテキスト前処理、 Web 部分 テキスト解析は C++ では大変 Web アプリケーションを C++ で作るのは手
間Thrift: 各言語が得意な箇所をその言語で実装して RPC で結合
XS や SWIG との違い
XS 、 SWIG → ライブラリレベルでの結合
Thrift → サービスレベルでの結合 RPC, 分散オブジェクト呼び出し CORBA などに類似
Thrift で RPC の手順
Thrift IDL を書く thrift コマンドでコードを生成 サーバーを書く クライアントを書く
1. Thrift IDL でインタフェースを定義
#!/usr/bin/thrift
service Hello{ string hello(1: string name)}
hello("naoya") → "Hello, naoya"
2. thrift コマンドでコード生成
クライアント用 perl ライブラリ サーバー用 C++ スケルトン
% thrift --gen cpp --gen perl hello.thrift% ls -Fgen-cpp/ gen-perl/ hello.thrift
サーバーのスケルトン
#include "Hello.h"/* 中略 */
class HelloHandler : virtual public HelloIf { public: HelloHandler() { // Your initialization goes here }
void hello(std::string& _return, const std::string& name) { // Your implementation goes here printf("hello\n"); }};
int main(int argc, char **argv) { int port = 9090; /* ... 以下略 ...*/
3. サーバーを書く
スケルトンにドメインロジックを書く
void hello(std::string& _return, const std::string& name) { // Your implementation goes here _return.append("Hello ").append(name);}
サーバーコンパイル , 立ち上げ
% g++ -g Hello_server.cpp Hello.cpp > -o Hello_server \> -lthrift \> -I/usr/local/include/thrift
% ./Hello_server
4. Perl でクライアントを書く
use lib './gen-perl';
## Thrift インストール時にインストールされているライブラリ群use Thrift;use Thrift::BinaryProtocol;use Thrift::Socket;
## IDL から gen-perl/ 以下に生成されたライブラリuse Hello;
my $transport = Thrift::Socket->new('localhost', 9090);my $client = HelloClient->new( Thrift::BinaryProtocol->new($transport) );
$transport->open();
printf "%s\n", $client->hello("naoya");
$transport->close();
実行
% perl hello.plHello, naoya
Ruby でクライアントを書く
transport = TBufferedTransport.new(TSocket.new('localhost', 9090))client = Hello::Client.new( TBinaryProtocol.new(transport))
transport.open
puts client.hello("naoya")
transport.close
Perl 版とほとんど同じ Thrift の抽象レイヤの賜
Thrift の良い所
複雑なシステム環境が必要いらず
メジャーな言語に対応 C++, C#, Erlang, Haskell, Java, Objective
C, OCaml, Perl, PHP, Python, Ruby, Squeak Java でサーバ、 Ruby でクライアント Haskell でサーバ、 OCaml でクライアント ...
世界最大規模のサイトでの稼働実績 Facebook の Web サーバーは 10,000 台以上
Thrift 内部の抽象レイヤの設計が◎
Perl で Thrift
Thrift の Perl サポート クライアントはサポートされている サーバーは今のところ未サポート
Perl のサーバー実装を作りました http://github.com/naoya/perl-thrift-
server/tree/master
Web+DB PRESS Vol.46 にて解説
Thrift 情報
CyDN - フレームワーク「 Thrift 」調査報告 Thrift の概要、簡単な利用方法 http://cydn.cybozu.co.jp/2007/06/thrift.html
Thrift Wiki オフィシャル Wiki http://wiki.apache.org/thrift/
Thrift Whitepaper Thrift IDL の詳細、内部設計についても言及あり http://developers.facebook.com/thrift/thrift-200704
01.pdf
まとめ
Thrift を使うと複数言語の良い所取りでサービス開発が可能です
IDL を書いてコードを生成し、クライアントとサーバーを書きます
Thanks!