about thrift

18
Thrift Naoya Ito naoya at hatena ne jp

Upload: naoya-ito

Post on 24-May-2015

6.570 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: about Thrift

Thrift

Naoya Itonaoya at hatena ne jp

Page 2: about Thrift

Thrift

クロス言語 RPC フレームワーク http://developers.facebook.com/thrift/ http://incubator.apache.org/thrift/

Page 3: about Thrift

Thrift が使える場面

検索サービス開発 C++ でインデクサ、エンジン

" 整数を bit 単位で圧縮 " な世界に LL は使いづらい

Perl や PHP でテキスト前処理、 Web 部分 テキスト解析は C++ では大変 Web アプリケーションを C++ で作るのは手

間Thrift: 各言語が得意な箇所をその言語で実装して RPC で結合

Page 4: about Thrift

XS や SWIG との違い

XS 、 SWIG → ライブラリレベルでの結合

Thrift → サービスレベルでの結合 RPC, 分散オブジェクト呼び出し CORBA などに類似

Page 5: about Thrift

Thrift で RPC の手順

Thrift IDL を書く thrift コマンドでコードを生成 サーバーを書く クライアントを書く

Page 6: about Thrift

1. Thrift IDL でインタフェースを定義

#!/usr/bin/thrift

service Hello{ string hello(1: string name)}

hello("naoya") → "Hello, naoya"

Page 7: about Thrift

2. thrift コマンドでコード生成

クライアント用 perl ライブラリ サーバー用 C++ スケルトン

% thrift --gen cpp --gen perl hello.thrift% ls -Fgen-cpp/ gen-perl/ hello.thrift

Page 8: about 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;   /* ... 以下略 ...*/

Page 9: about Thrift

3. サーバーを書く

スケルトンにドメインロジックを書く

void hello(std::string& _return, const std::string& name) { // Your implementation goes here _return.append("Hello ").append(name);}

Page 10: about Thrift

サーバーコンパイル , 立ち上げ

% g++ -g Hello_server.cpp Hello.cpp > -o Hello_server \> -lthrift \> -I/usr/local/include/thrift

% ./Hello_server

Page 11: about Thrift

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();

Page 12: about Thrift

実行

% perl hello.plHello, naoya

Page 13: about Thrift

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 の抽象レイヤの賜

Page 14: about Thrift

Thrift の良い所

複雑なシステム環境が必要いらず

メジャーな言語に対応 C++, C#, Erlang, Haskell, Java, Objective

C, OCaml, Perl, PHP, Python, Ruby, Squeak Java でサーバ、 Ruby でクライアント Haskell でサーバ、 OCaml でクライアント ...

世界最大規模のサイトでの稼働実績 Facebook の Web サーバーは 10,000 台以上

Thrift 内部の抽象レイヤの設計が◎

Page 15: about Thrift

Perl で Thrift

Thrift の Perl サポート クライアントはサポートされている サーバーは今のところ未サポート

Perl のサーバー実装を作りました http://github.com/naoya/perl-thrift-

server/tree/master

Web+DB PRESS Vol.46 にて解説

Page 16: about Thrift

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

Page 17: about Thrift

まとめ

Thrift を使うと複数言語の良い所取りでサービス開発が可能です

IDL を書いてコードを生成し、クライアントとサーバーを書きます

Page 18: about Thrift

Thanks!