wiki:ThriftBrief

Thriftの概要

作者:kosuke

参考論文: 著者 Mark Slee, Aditya Agarwal and Marc Kwiatkowski タイトル  Thrift: Scalable Cross-Language Services Implementation

Thriftの目的は、様々な言語で書かれた各サーバー、各クライアントで共通で実行したいライブラリを抽出することです。Thriftは、開発者がその抽出したデータのデータタイプとサービスインターフェイスを定義できるようにしています。FaceBookのシステムはスケールするので、簡単にスケールするようなしくみなっています。具体的には、サーバーを止めずにシステムを変更できるようになっているなどがあります。余談ですが、FaceBookの哲学に、言語を統一化することによってベストなツールを使って実装を可能にするといものがあるそうです。この哲学にのっとてできたのがThriftです。

FaceBookでは最初、全体的なデザインとして、さまざまな言語間をつなぐ高いパフォーマンスの橋渡しみたいなものを作ることを目指しました。しかし、それでは十分なdatatypeの自由がなかったり、標準以下のパフォーマンスが発揮されませんでした。

これらの解決策は、あらゆる言語で実行される、言語に中立的なソフトウェアとコード発生器(そのソフトウェアのシンプルなインターフェイスとデータ定義をさまざまな言語でかかれているクライアントやサーバーに翻訳する機能)を組み合わせることでした.。しかも、十分なパフォーマンスを実現するためには、静的なコードにする必要がありました。そうすることによって、内向きな実行時間を気にする必要なく、優れたコードを書くことができます。もちろん、シンプルなデザインにするねらいもあります。

こういったソフトウェアがいままでなかったことへの驚きが、Thrift開発者のモチベーションになったみたいです。

ネットワーク環境で、Thrift開発にチャレンジをした時に、いくらかの主要な5つの要素が必要になりました。

1つ目は、type要素です。共通のタイプ(int,charなどの型)はアプリケーション開発者が、カスタムのThriftの型を使ったり、彼ら自身がシリアライズコードを書いたりしなくても存在しなければなりません。言うならば、C++プログラマーが意識せずに強固なSTLマップを動的なpython ディクショナリに変換できるべきです。プログラマーがコードを書くときに、アプリケーションレイヤより下のコードを書かなくても、共通の型を使えるようにしなければなりません.

2つ目はtransport要素です。各言語は双方向の加工していないデータのやりとりするときに、共通なインターフェイスをもっていなければなりません。特徴は、サービス開発者が気にする必要がないようにすることです。同じアプリケーションコードは、TCPストリームソケットでなくても、メモリ上のデータでも、ディスク上のファイルでも実行できるようにするべきです.

3つ目は、プロトコル要素です。データの型は、データ型自身でエンコードやデコードするために、Transport層を使う方法がいくつもあるべきです。また、アプリケーション開発者がこの層を気にせず開発できるようにするべきです。サービスがXMLもしくはバイナリプロトコルを使っても、アプリケーションコードには影響を及ぼさないようにするべきです。全てのデータの読み込み書き込みは、一貫性のあるものでなければなりません。

4つ目は、Versioningです。巨大なサービスでは、データ型は、それ自体が同時編集出きるようにしなければなりません。特に、サービスを止めることなく、オブジェクトで領域を加えたり、引くこともしくは、機能のリストを変更したり出きるようにするべきです。

5つ目は、Processorsです。最終的には、Thriftを運用する人が、RPCを実現するために、データストリームを処理することを可能にするコードを書けるようにすることです。