Thrift: Scalable Cross-Language Services Implementation

May 30, 2021

ThriftはFacebookで開発されたRPCライブラリで、IDLからクライアントとサーバのコードを生成する。 Thrift自体は、大きくType, Transport, Protocol, Versioning, Processorの5つのコンポーネントからなる。

Typeは、IDLで宣言するデータの型であり、生成されるコードのプログラミング言語の標準なデータ型と対応する。 たとえば、Thriftの辞書型からはPythonのdictが生成される。

TransportはTCPやHTTPなどシリアライズされたデータを通信するストリームにあたる。 Transportは、open, close, read, writeなどを備えたインターフェースを提供し、Transportを呼び出すコードがストリームの種類に依存しないように作られている。

Protocolは、JSONなど、型で構造を制約されたデータをTransportで転送するためのシリアライズ、デシリアライズの表現形式にあたる。 ThriftのユーザがProtocolを意識する必要はない。 Protocolも、Transportと同様、writeFieldBegin, writeFieldEndなどを宣言したインターフェースを提供している。 インターフェースは、処理性能を上げるために、フレーム分割や事前のデータ長さ計算をせずに読み書きできる実装形式を強制している。

Thriftは、クライアントとサーバ間のバージョンの違いや定義の違いに対して頑強に設計されており、受信側で期待しないフィールドがあっても、エラーにならず、フィールドは暗黙的に破棄される。 期待するフィールドがない場合については、各フィールドが存在するかを示す真偽値をもったissetという構造体があり、issetを調べることでフィールドがない場合のフォールバックを開発者は実装できる。

ProcessorはIDLにしたがってコードを生成する。 サーバは複数のクライアントからのリクエストを並行処理できなければいけないので、マルチスレッドを使ったサーバのコードを生成しなければならない。 Thriftはできるだけ依存ライブラリの数を減らす方針で実装されている。 そのため、マルチスレッドを標準のライブラリで提供されていないC++のサーバは、boost::shared_ptrをもちいたThrift独自のマルチスレッドのライブラリで実装されている。 ライブラリは、Javaのマルチスレッドの設計が借用されており、並行処理の基本概念にあたるMutex, Condition, Monitorに加え、Thread, RunnableクラスやsyncrhonizedブロックをまねるためのSynchronizedクラスがある。

論文をこちらからダウンロードできます。