Using Thrift
Fumihiko Sato
Agenda
Thrift とは
なぜ RPC
Thrift の特徴
使いかた
参考
※ 本内容の対象バージョン: 0.2.0
Thrift とは
Facebook で開発された RPC フレームワーク
( 現在は OSS として Apache 財団に寄与 )
そもそも、 RPC (Remote Procedure Call) とは ...
プログラムから別のアドレス空間にある
サブルーチンや手続きを実行することを可能にする技術
例) CORBA, XML-RPC(SOAP)
REST は一意の URI に対してリソースを要求するもので、 RPC は操作を要求するものとして区別される。
同様の目的で、 Protocol Buffer(Google), BERT-RPC(GitHub) などがある。
なぜ RPC
昨今の Web サービス実装において、
LAMP だけでは解決しないケースが多い
役割に応じてリソースを分散し、
それぞれの役割に最適な言語で処理を
記述するのが主流の設計となっている
処理 / リソース ( データ ) 要求において
、 手軽な REST が使われることが多いが
転送データサイズが肥大化したり、
実装側でパースとか面倒だったりする
Thrift の特徴
・既存の RPC(SOAP, CORBA) に比べて軽量で自由度が高い
・サポート言語が豊富
C++(g++ 3.3.5+ with Boost 1.33.1+), Java(1.5+/Ant), Python(2.4+) PHP(5.0+), Ruby(1.8+), Perl(5/Bit::Vector/Class::Accessor),
Erlang(R12), Cocoa,...
各言語用の Server/Client コードジェネレータが付属している (thrift コマンドはジェネレータそのものだったりする )
・プロトコル層とトランスポート層を抽象レイヤとして
設計されているため、言語別で同等の API を提供する
・バージョニング(メソッドパラメータ)
Thrift の特徴
Thrift のレイヤについて Client 側から考察
→ IDL より自動生成される Client モジュール
→ TBinaryProtocol しかないみたい
→ TBufferdTransport(with TSocket)
THttpClient( 言語の HTTP client 機能を使用 ) その他 ...
実装言語で若干種類が異なるようだ
↑ 下層のインスタンスを持って上層のインスタンスを生成するイメージ。
Thrift の特徴
Thrift で扱えるデータ型
・基本データ型
bool(true/false), byte(signed byte), i16(16-bit signed integer), i32(32-bit signed integer), i64(64-bit signed integer),
double(64-bit floating point number), strin(text/binary)
・構造体
・コンテナ
list(ordered list), set(unordered list), map(key-value)
・例外
・サービス
(インストール方法は省略)
使い方
■ 準備
1) IDL にてインターフェースを定義する
例として "Hello" というサービスで
hello というメソッドを hello.thrift に記述したとする #!/usr/local/thrift/bin/thrift
service Hello {
string hello(1: string name) }
2) thrift コマンドにより、対象言語のコードを生成
例としてサーバに C++, クライアントに PHP を使うとする
$ thrift --gen cpp --gen php hello.thrift
使い方
■ サーバ側
1) Server スケルトンのドメインロジックを記述する
$ cd gen-cpp/
$ cp Hello_server.skeleton.cpp Hello_server.cpp $ vi Hello_server.cpp
→ IDL で定義したメソッド内部のロジックだけを記述する
必要に応じて include するヘッダファイルの追加等はある
使い方
2) コンパイル
$ g++ Hello_server.cpp Hello.cpp -o Hello_server -lthrift ¥ -I/usr/local/include/thrift
3) 起動(デフォルトではポート 9090 で listen )
$ ./Hello_server
使い方
■ クライアント側
1) Thrift の PHP モジュールおよび生成モジュールを
然るべき場所に格納する
使い方
2) クライアントスクリプトの作成 (hello.php)
[ 概要 ]
- $GLOBALS['THRIFT_ROOR'] = 然るべきパスを設定
- ホスト、ポート指定で TSocket インスタンス ($tsock) を作成 - $tsock をもって TTransport インスタンス ($ttrans) を作成
- $trrans をもって TProtocol インスタンス ($tproto) を作成 - $tproto をもって HelloClient インスタンス ($client) を作成 - $ttrans->open();
- $res = $client->hello($arg); IDL← 定義のメソッド - $ttrans->close();
使い方
使い方
3) 叩く
$ php hello.php Thrift
Hello Thrift $res← を echo したとして
接続に失敗した場合は、 TException が発生する getMessage するとこんな感じ
TSocket: Could not connect to fedora:9090 (Connection refused [61])