[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
SlideShare a Scribd company logo
Thrift Naoya Ito naoya 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  でインタフェースを定義 hello("naoya")  ->  "Hello, naoya" #!/usr/bin/thrift service Hello { string hello(1: string name) }
2. thrift  コマンドでコード生成 クライアント用 perl ライブラリ サーバー用 C++ スケルトン % thrift --gen cpp --gen perl hello.thrift % ls -F gen-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"); } }; 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",  $client->hello("naoya") ; $transport->close();
実行 % perl hello.pl Hello, naoya
Ruby  でクライアントを書く Perl 版とほとんど同じ Thrift の抽象レイヤの賜 transport = TBufferedTransport.new(TSocket.new('localhost', 9090)) client = Hello::Client.new( TBinaryProtocol.new(transport)) transport.open puts  client.hello("naoya") transport.close
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-20070401.pdf
まとめ Thrift を使うと複数言語の良い所取りでサービス開発が可能です IDL を書いてコードを生成し、クライアントとサーバーを書きます
Thanks!

More Related Content

about Thrift

  • 1. Thrift Naoya Ito naoya at hatena ne jp
  • 2. Thrift クロス言語 RPC フレームワーク http://developers.facebook.com/thrift/ http://incubator.apache.org/thrift/
  • 3. Thrift が使える場面 検索サービス開発 C++ でインデクサ、エンジン "整数をbit単位で圧縮" な世界に LL は使いづらい Perl や PHP でテキスト前処理、Web 部分 テキスト解析は C++ では大変 Web アプリケーションを C++ で作るのは手間 Thrift: 各言語が得意な箇所をその言語で実装して RPC で結合
  • 4. XS や SWIG との違い XS、SWIG ->ライブラリレベルでの結合 Thrift -> サービスレベルでの結合 RPC, 分散オブジェクト呼び出し CORBA などに類似
  • 5. Thrift で RPC の手順 Thrift IDL を書く thrift コマンドでコードを生成 サーバーを書く クライアントを書く
  • 6. 1. Thrift IDL でインタフェースを定義 hello("naoya") -> "Hello, naoya" #!/usr/bin/thrift service Hello { string hello(1: string name) }
  • 7. 2. thrift コマンドでコード生成 クライアント用 perl ライブラリ サーバー用 C++ スケルトン % thrift --gen cpp --gen perl hello.thrift % ls -F gen-cpp/ gen-perl/ hello.thrift
  • 8. サーバーのスケルトン #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"); } }; int main(int argc, char **argv) { int port = 9090;    /* ... 以下略 ...*/
  • 9. 3. サーバーを書く スケルトンにドメインロジックを書く void hello(std::string& _return, const std::string& name) { // Your implementation goes here _return.append("Hello ").append(name); }
  • 10. サーバーコンパイル , 立ち上げ % g++ -g Hello_server.cpp Hello.cpp > -o Hello_server > -lthrift > -I/usr/local/include/thrift % ./Hello_server
  • 11. 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", $client->hello("naoya") ; $transport->close();
  • 12. 実行 % perl hello.pl Hello, naoya
  • 13. Ruby でクライアントを書く Perl 版とほとんど同じ Thrift の抽象レイヤの賜 transport = TBufferedTransport.new(TSocket.new('localhost', 9090)) client = Hello::Client.new( TBinaryProtocol.new(transport)) transport.open puts client.hello("naoya") transport.close
  • 14. Thrift の良い所 複雑なシステム環境が必要いらず メジャーな言語に対応 C++, C#, Erlang, Haskell, Java, Objective C, OCaml, Perl, PHP, Python, Ruby, Squeak Java でサーバ、 Ruby でクライアント Haskell でサーバ、 OCaml でクライアント ... 世界最大規模のサイトでの稼働実績 Facebook の Web サーバーは 10,000 台以上 Thrift 内部の抽象レイヤの設計が◎
  • 15. Perl で Thrift Thrift の Perl サポート クライアントはサポートされている サーバーは今のところ未サポート Perl のサーバー実装を作りました http://github.com/naoya/perl-thrift-server/tree/master Web+DB PRESS Vol.46 にて解説
  • 16. 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-20070401.pdf
  • 17. まとめ Thrift を使うと複数言語の良い所取りでサービス開発が可能です IDL を書いてコードを生成し、クライアントとサーバーを書きます