もともとFacebookで作成され、現在はApacheの一部となっているThriftは、複数の言語で記述されたサービス間で大規模で効率的なRPCを実現することを目的としたインターフェイス定義言語(IDL)およびバイナリ通信プロトコルである。Facebookは最近hsthrift
をオープンソース化した。これにより、HaskellプロジェクトでThriftを使用し、その依存型を利用して本番環境のバグを排除することができる。
Thriftは、クライアントとサーバのRPCコードにコンパイルできる言語に依存しないIDLを提供する。
Haskell Thriftコンパイラは、他のThriftサービスとの通信に必要なHaskellコードを生成します。付属のライブラリを使用すると、HaskellでThriftクライアントとThriftサーバの両方を構築できます。
Thrift for Haskellのオープンソース化により、HaskellプロジェクトがThriftを使用して他の言語で記述されたサービスと通信できるようになった。Haskell Thriftツールチェーンには、標準のThriftツールチェーンにはない追加機能が含まれている。特に、Haskell Thriftコンパイラは、型チェックの前に、生成されたコードを整理して未使用のシンボルを削除できる。そして、exactprintにインスパイアされたライブラリを使用してThrift抽象構文ツリーの変換をサポートする。また、型チェックプラグインを指定して、型チェックルールをターゲット言語に合わせて調整するメカニズムが含まれている。
Thrift for Haskellの主な約束の1つは、Haskellの強力な正確性保証のおかげで、本番システムのバグを排除できる可能性である。具体的には、Facebookは、Haskell依存型を使用することで、実際のコードのバグを見つけて排除できたと主張している。依存型は、Haskellコンパイラがチェックする型レベルで、コードに関する不変条件を表現する手段を提供する。Haskellは実は依存型言語ではないが、Thriftはこのアプローチの有用性を示すための完全なプレイグラウンドを提供している。
Haskell Thriftコンパイラをデプロイすると、既存のC++実装に多くのバグが発生しました。その実施は、Haskell以外の言語向けのThriftコードを生成するために使用されています。そのバグは、不適切な入力、無限のループ、誤った強制、あいまいな動作を受け入れるものです
Thrift for HaskellにはFacebook版のThrift、fbthrift
が必要であることを考慮することが重要である。それはApache Thriftのクライアントやサーバと互換性がない。
Thriftは、C/C++、C#、Erlang、Go、Java、JavaScriptなど、多数のターゲット言語をサポートしている。
Thriftインターフェースの簡単な例として、JavaとPythonの単純な乗算サービスを定義する方法は次のとおりである。
namespace java tutorial
namespace py tutorial
typedef i32 int
service MultiplicationService
{
int multiply(1:int n1, 2:int n2),
}
IDLコンパイラに加えて、Thriftは、いくつかのプロトコルとトランスポート層を実装するランタイムライブラリも提供する。これは、開発者がコードを再コンパイルすることなく使用でき、交換可能である。たとえば、Thriftは、パフォーマンスを向上させるためにバイナリ形式を使用するTBinaryProtocol
と、データのエンコードにJSONを使用するTJSONProtocol
を提供する。同様に、Thriftはファイルベースのトランスポート、ブロッキングソケット、メモリなどを使用できる。さらに、Thriftには、さまざまなリクエスト処理戦略を使用してサービスを簡単に実装できるように、すぐに使用できるサーバも多数含まれている。戦略としては、シンプルなシリアルサーバ、マルチスレッドのノンブロッキングサーバ、スレッドプールを使用するマルチスレッドサーバなどがある。
言語に依存しないRPCの選択肢は、Thriftだけではない。最も注目すべきは、Googleが同じ目標でProtocol Buffers
に基づいてgRPC
フレームワークをオープンソース化したことである。gRPCは、Square、Netflixなどを含む多くの組織で使用されている。さまざまなRPCコード生成ソリューションの比較については、CodeGenの再考:IDL、Thrift、gRPC、OhhMyをチェックしてください。