Thriftとプロトコルバッファーの最大の違いは?


286

Apache ThriftGoogleのプロトコルバッファーの最大の長所と短所は何ですか?


4
付記として、Marc Gravellは、Googleのprotobufを操作するためのライブラリprotobuf.netを維持しています。このライブラリは、code.google.com / p / protobuf
netにあります-RCIX 09/09/27

5
この質問と次の回答のいくつかは約6歳です。それ以来、おそらく多くのことが変わった。
AlikElzin-kilaka 2015年

回答:


159

どちらも同じ機能の多くを提供します。ただし、いくつかの違いがあります。

  • Thriftは「例外」をサポートします
  • プロトコルバッファのドキュメント/例が大幅に改善されました
  • Thriftには組み込みSetタイプがあります
  • プロトコルバッファは「拡張」を可能にします。外部コードが値を操作できるようにしながら、外部プロトを拡張してフィールドを追加できます。Thriftではこれを行う方法はありません
  • プロトコルバッファがはるかに読みやすい

基本的に、それらはかなり同等です(私が読んだものよりもプロトコルバッファーの方が少し効率的です)。


16
このプレゼンテーションでは、2013年の時点でそれらについて詳しく
BAR

13
thriftはさらに10言語をサポート
Elijah Saounkine '11

1
一部の言語では、拡張機能を追加できます。たとえば、Thriftは拡張が容易なC#の部分クラスを生成します。しかし、それは一般的なルールではありません、それは本当です。
JensG、2015年

grpc 1.0(proto3)のサポートmap
KindDragon

85

もう1つの重要な違いは、デフォルトでサポートされる言語です。

  • プロトコルバッファ:Java、Android Java、C ++、Python、Ruby、C#、Go、Objective-C、Node.js
  • Thrift:Java、C ++、Python、Ruby、C#、Go、Objective-C、JavaScript、Node.js、Erlang、PHP、Perl、Haskell、Smalltalk、OCaml、Delphi、D、Haxe

どちらも他のプラットフォームに拡張できますが、これらはそのまま使用できる言語バインディングです。


16
protobufは、優れたRubyサポートgithub.com/macks/ruby-protobufおよびcode.google.com/p/ruby-protobufをサポートしています。私はC#(3.5)とRubyのprotobufを使用しています。C#はデータをシリアル化し、必要に応じてRubyを逆シリアル化してタスクに取り組んでいます。
ブライアン・ベイリアッシュ、2011

6
code.google.com/p/protobuf/wiki/ThirdPartyAddOnsには、PHP、Ruby、Erlang、Perl、Haskell、C#、OCaml、およびActiona Script、Common Lisp、Go、Lua、Mathlab、Visual Basic、Scalaがリストされています。これらはすべてサードパーティの実装だと思った。
Igor Gatis

目的C(iOSとOS Xの両方)でprotobuf C ++ファイルを直接使用できます。このqnをチェックしてください
Tushar Koul

私が見code.google.com/p/protobuf-net、多くの場合、C#のためのいるProtobufポートとして言及されているが、それは完全に真実ではありません。ProtobufとThriftの重要な機能の1つは外部構造定義であるため、同じ定義を異なる言語で使用できます。protobuf-netは、C#コード内に構造体定義を埋め込むため、この機能をサポートしていません。
Andriy Tylychko 2013年

@AndyT:それは議論の余地があります-構造定義がサポートしたいすべての言語にとって外部であることが利点であるかどうかに依存します protobuf-netを使用して、C#でデータ構造を定義し、そこから.protoファイルを生成します。これを使用して、他の言語でサポートを作成できます。私は非常にC#中心であり、Android / Javaを既存の大規模な.Netアプリケーションと統合する過程にあるので、これは利点だと思います。したがって、引き続きC#クラスを最終的な構造定義と見なしたいと思います。
RenniePet 2013

73

RPCも重要な違いです。Thriftは、RPCクライアントとサーバーを実装するコードを生成します。プロトコルバッファーは、ほとんどがデータ交換形式としてのみ設計されているようです。


9
それは真実ではない。プロトコルバッファはRPCサービスAPIを定義し、メッセージパッシングを実装するために利用可能ないくつかのライブラリがあります。
スティーブン

7
ProtobufにRPCが定義されていないとは言いませんでした。それは、そのために設計されたようではないようです。少なくとも、誰もがアクセスできる外部リリースはそうではありません。このGoogleのエンジニアのコメントを読んで、ここで
apale saidimu

9
さらに重要なことに、ThriftにはRPCサポートが組み込まれています。Protobufは現在サードパーティのライブラリに依存しているため、目が少なく、テストが少なく、コードの信頼性が低くなっています。
アレックトーマス

2
私にとっては、ProtoBufの良い点です。シリアル化のみが必要な場合は、無駄なコードを追加しないでください。そして、将来的にRPCで送信する必要がある場合でも、問題なく機能します。私はネットワークにNettyを使用しており、Protobufは完全に統合されているため、問題もテストもなく、パフォーマンスを最大化します。
キキワ2013

14
実際、原型はRPCを考慮して設計されました。Googleはごく最近、そのコンポーネント– grpc.io
andybonsを

57
  • Protobufシリアル化オブジェクトは、Thriftよりも約30%小さくなります。
  • protobufオブジェクトで行うほとんどのアクション(作成、シリアライズ、デシリアライズ)は、をオンにしない限り、スリフトよりもはるかに遅くなりますoption optimize_for = SPEED
  • Thriftには、より豊富なデータ構造(マップ、セット)があります。
  • 生成されたクラスはすべて内部クラスとしてパックされているため、Protobuf APIはすっきりしています。
  • Thrift列挙型は実際のJava列挙型ではありません。つまり、単なる列挙型です。Protobufには実際のJava列挙型があります。

違いの詳細については、このオープンソースプロジェクトのソースコードの差分を確認してください。


1
簡単な提案:ベースラインとして使用されている別の非バイナリ形式(xmlまたはjson?)があった場合、それはきちんとしているでしょう。一般的な傾向を示す優れたテストはありませんでした。仮定としては、PBとThriftの方が効率的ですが、もしそうなら、どれだけ効率的かは、主に未解決の問題です。
StaxMan 2009年

4
0.02秒?!そのような時間的な余裕はありません
Chris S

1
Thriftに複数のプロトコル(TCompactProtocolを含む)があるため、最初の箇条書きはもう適用されないと思います。
Janus Troelsen、2012

13
スピードオプションの最適化は現在、プロトコル・バッファー(デフォルトでcode.google.com/apis/protocolbuffers/docs/proto.html
ウィレム・

5
「optimize_for = speed」を設定して30%小さいオブジェクトを取得できますか?それとも妥協していますか?
Prashant Sharma 2013

56

「Thrift vs Protocol buffers」トピックとして言ったように:

参照すると、JSONの比較対いるProtobuf対スリフト

さらに、これらのソリューションで利用できる興味深い追加のツールがたくさんあります。Protobufの例を以下に示します:Protobuf-wiresharkprotobufeditor


10
これは完全な円です。3つの(類似した)質問に対してまったく同じ回答を投稿しました。私はゼルダをプレイしているように感じ、サインを逃しました。
ChrisR、2015年

+ ChrisRへえ、どうやってそれが起こったのか思い出せません。似たような質問がいくつかありましたが、サイクルではなく3つの構造を作成する必要があります。ある日…それは非常に古い質問で、今電話から返信しています。とにかく、キャッチありがとう!
Grzegorz Wierzowiecki

6
「Thriftには優れたチュートリアルが付属しています」-面白いです。これまでに見た中で最も不完全なチュートリアルです。TSimpleServerの横で何かを実行したい場合、すぐに行き詰まります
MarianKlühspies15年

ThriftにもWiresharkプラグインがあります:github.com/andrewcox/wireshark-with-thrift-plugin
CCoder 2015

8

Protocol Buffersはよりコンパクトな表現を持っているようですが、それは私がThriftホワイトペーパーを読んで得た印象にすぎません。彼ら自身の言葉で:

コードの簡素化と明確化のために、いくつかの極端なストレージ最適化(つまり、小さな整数をASCIIにパックする、または7ビットの継続形式を使用する)は行わないことにしました。これらの変更は、パフォーマンスを重視するユースケースで必要な場合に簡単に行うことができます。

また、それは私の印象かもしれませんが、プロトコルバッファーには、構造体のバージョン管理に関するより厚い抽象化がいくつかあるようです。Thriftにはバージョン管理のサポートがいくつかありますが、それを実現するには少し労力が必要です。


1
Thriftが可能な限りコンパクトではないことを認めているという事実が、なぜプロトコルバッファがそうであると信じるようになるのですか?
Michael Mior

1
プロトコルバッファは、値とフィールド識別子の両方に可変長整数コーディングを使用します。したがって、小さな値のintフィールドを送信する非常に一般的なケースは、int16やint32ではなく、2バイトになります。
poolie 2012年

「プロトコルバッファは可変長整数コーディングを使用します」-TCompactProtocolもそうです
JensG

8

Pythonのprotobuffと比較して、テキストベースのプロトコルの方がパフォーマンスを向上させることができました。ただし、protobuffが提供する型チェックやその他の豪華なutf8変換などはありません。

したがって、シリアライゼーション/デシリアライゼーションが必要な場合は、おそらく他のものを使用できます。

http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html


7

まだ言及されていない明らかなことの1つは、どちらも賛否両論の可能性があることです(両方とも同じです)は、これらがバイナリプロトコルであることです。これにより、よりコンパクトな表現が可能になり、パフォーマンス(長所)が向上する可能性がありますが、読みやすさ(またはデバッグ可能性)が低下します。

また、どちらのツールも、xml(およびおそらくjson)のような標準形式よりもツールサポートが少し少なくなっています。

(編集)これは、サイズとパフォーマンスの違いの両方に取り組む興味深い比較であり、他のいくつかのフォーマット(xml、json)の数値も含まれています。


3
プロトコルバッファをXMLよりもはるかに人間が読みやすいテキスト表現に出力するのは簡単です:my_proto.DebugString()。例については、code.google.com
apis /

もちろん、すべてのバイナリ形式について同じことが言えます-しかし、これはそれらをそのまま読みやすくするものではありません(ネットワークでデバッグ)。さらに悪いことに、protobufの場合、フィールド名を知るにはスキーマ定義が本当に必要です。
StaxMan 2011年

Thriftは、ユーザー定義のさまざまなプロトコルもサポートしています。バイナリ、コンパクト、jsonなど、先週考案したものを使用できます。
JensG

6

ウィキによると、ThriftランタイムはWindowsでは動作しません。


5
WindowsでThriftを実行しました。github.com/aubonbeurre/thriftで
Sergey Podobry

20
公式のメインラインブランチはWindowsにも対応しています。
Janus Troelsen、2012

5
@dalle-Alex PがThriftにBoostスレッドのサポートを追加。これは、Windowsのデフォルトのスレッド化です。* NIXのデフォルトはpthreadです。Janus Tを確認するために、ThriftはWindowsを完全にサポートするようになりました。
pmont

21
これは古い情報です。ThriftはWindowsで完全に動作するようになりました。
JensG、2015年

6

ProtocolBuffersはより高速です。
ここに素晴らしいベンチマークがあります:http :
//code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

Avroはさらに高速であるため、Avroを調べてみることもできます。
Microsoftのパッケージはここにあります:http :
//www.nuget.org/packages/Microsoft.Hadoop.Avro

ちなみに、今まで見た中で最速はCap'nProtoです。
AC#の実装は、Marc GravellのGithub-repositoryにあります


4

これらの点のほとんどは、ThriftがRPCフレームワークであり、たまたまさまざまな方法(バイナリー、XMLなど)を使用してデータをシリアル化できるという基本的な事実を見逃していると思います。

プロトコルバッファーは純粋にシリアル化のために設計されており、Thriftのようなフレームワークではありません。


3
RPCフレームワークとはどういう意味ですか?それはprotobufのgRPCとどう違うのですか?
marcelocra

gRPCはprotobufと一緒にパッケージ化されていません。それは10年後のように開発されました。Thriftには、完全なRPCフレームワークがパッケージされています。一緒に作られました。
三部作


0

ここにはいくつかの優れた点があります。誰かのパスがここを横切った場合に備えて、もう1つ追加します。

Thriftは、thrift-binaryとthrift-compact(de)シリアライザーのどちらかを選択するオプションを提供します。thrift-binaryは、優れたパフォーマンスを提供しますが、パケットサイズは大きくなります。一方、thrift-compactは、優れた圧縮を提供しますが、より多くの処理能力を必要とします。これは、コードの行を変更するのと同じくらい簡単に、これら2つのモードをいつでも切り替えることができるので便利です(実際には、構成可能にすることもできます)。そのため、アプリケーションをパケットサイズまたは処理能力でどの程度最適化する必要があるかわからない場合、リサイクルは興味深い選択肢になる可能性があります。

PS:thekvsthrift-binary、thrift-compact、protobufなどの多くのシリアライザーを比較するこの優れたベンチマークプロジェクトを参照してください:https : //github.com/thekvs/cpp-serializers

PS:YASこのオプションを提供するという名前の別のシリアライザもありますが、スキーマレスです。上記のリンクを参照してください。


0

また、サポートされているすべての言語がthriftやprotobufと一貫性があるわけではないことに注意することも重要です。この時点で、それは基礎となるシリアル化に加えてモジュールの実装の問題です。使用する予定の言語のベンチマークを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.