Java で Thrift を使ってみて

Java で Thrift を試してみて得た know-how(あくまで独自研究なので注意)

マルチスレッドと Thrift

IDL から起こした Thrift.Client クラスはインスタンスのスレッド間で共有できない。
より正確に言うと、Thrift.Client 1つが1コネクションに対応しているようで、スレッド間でこれを共有して同時操作をすると例外を吐くようになる。

マルチスレッドで競合無くガンガンThrift RPCを出すにはスレッド毎に(スレッドローカルで) Thrift.Client クラスのインスタンス(=Thriftのコネクション)を持つか、あるいはコネクションプールを実装して同時使用を避けつつ使い回す仕組みが必要になるっぽい(自分は後者で対処しました)。

推測だけど、Thrift は1コネクション中には1ペアの req - resp しか存在できず、パイプライン的なことはできないプロトコルになっているのではなかろうか。
msgpack-rpc みたいにコネクション上での非同期RPCが前提になっていたらパイプライン的にどんどんリクエストを流していくことはできるわけですが、どうも Thrift はそうなっていない様子。

Thrift は return null できない

多言語との相互運用の都合で return null を上手く扱えない。
Java でしか使わない場合はIDLで生成したコードにパッチあてることで回避可能(但し、他言語との相互運用に影響がでるかも)。
「Thrift で null を返すには?(id:naga_sawa:20100724#1279937046)」参照。