Thrift: Scalable Cross-Language Services Implementation
May 30, 2021Thriftは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
クラスがある。
論文をこちらからダウンロードできます。