Größte Unterschiede zwischen Thrift- und Protokollpuffern?

286

Was sind die größten Vor- und Nachteile von Apache Thrift gegenüber Googles Protokollpuffern ?

Jonas
quelle
4
Nebenbei bemerkt, Marc Gravell unterhält eine Bibliothek für die Arbeit mit Googles protobuf namens protobuf.net, die sich unter code.google.com/p/protobuf-net befindet
RCIX
5
Diese Frage und einige der folgenden Antworten sind ungefähr 6 Jahre alt. Wahrscheinlich hat sich seitdem viel geändert.
AlikElzin-Kilaka

Antworten:

159

Beide bieten viele der gleichen Funktionen. Es gibt jedoch einige Unterschiede:

  • Thrift unterstützt "Ausnahmen"
  • Protokollpuffer haben viel bessere Dokumentationen / Beispiele
  • Sparsamkeit hat einen eingebauten SetTyp
  • Protokollpuffer ermöglichen "Erweiterungen" - Sie können ein externes Proto erweitern, um zusätzliche Felder hinzuzufügen, während externer Code weiterhin die Werte bearbeiten kann. In Thrift gibt es keine Möglichkeit, dies zu tun
  • Ich finde Protokollpuffer viel einfacher zu lesen

Grundsätzlich sind sie ziemlich gleichwertig (mit Protokollpuffern etwas effizienter als ich gelesen habe).

Hazzen
quelle
16
Diese Präsentation erklärt sie gut ab 2013 slidehare.net/IgorAnishchenko/pb-vs-thrift-vs-avro
BAR
13
Sparsamkeit unterstützt wie 10 weitere Sprachen
Elijah Saounkine
1
Für einige Sprachen können Sie Erweiterungen hinzufügen. Beispielsweise generiert Thrift Teilklassen für C #, die leicht zu erweitern sind. Dies ist jedoch nicht die allgemeine Regel, das stimmt.
JensG
grpc 1.0 (proto3) unterstützt mapauch
KindDragon
85

Ein weiterer wichtiger Unterschied sind die standardmäßig unterstützten Sprachen.

  • Protokollpuffer: Java, Android Java, C ++, Python, Ruby, C #, Go, Objective-C, Node.js.
  • Sparsamkeit: Java, C ++, Python, Ruby, C #, Go, Objective-C, JavaScript, Node.js, Erlang, PHP, Perl, Haskell, Smalltalk, OCaml, Delphi, D, Haxe

Beide können auf andere Plattformen erweitert werden, dies sind jedoch die sofort verfügbaren Sprachbindungen.

Mike Gray
quelle
16
protobuf bietet eine hervorragende Ruby-Unterstützung: github.com/macks/ruby-protobuf und code.google.com/p/ruby-protobuf . Ich verwende Protobuf von C # (3.5) und Ruby, C # serialisiert die Daten und bei Bedarf deserialisiert Ruby und arbeitet an der Aufgabe.
Bryan Bailliache
6
code.google.com/p/protobuf/wiki/ThirdPartyAddOns listet PHP, Ruby, Erlang, Perl, Haskell, C #, OCaml plus Actiona-Skript, Common Lisp, Go, Lua, Mathlab, Visual Basic und Scala auf. Dachte, dies sind alles Implementierungen von Drittanbietern.
Igor Gatis
Sie können Protobuf C ++ - Dateien direkt in Ziel C verwenden (sowohl für iOS als auch für OS X). Überprüfen Sie dieses QN
Tushar Koul
Ich sehe, dass code.google.com/p/protobuf-net oft als Protobuf-Port für C # erwähnt wird, aber es ist nicht ganz richtig. Ein wichtiges Merkmal von Protobuf und Thrift ist die Definition der externen Struktur, sodass dieselbe Definition von verschiedenen Sprachen verwendet werden kann. protobuf-net unterstützt diese Funktion nicht, da es die Strukturdefinition in C # -Code einbettet.
Andriy Tylychko
@AndyT: Das ist umstritten - es hängt davon ab, ob es von Vorteil ist, dass die Strukturdefinition für alle Sprachen, die Sie unterstützen möchten, EXTERN ist. Mit protobuf-net definieren Sie Ihre Datenstruktur in C # und generieren daraus die .proto-Datei, mit der Sie die Unterstützung in den anderen Sprachen erstellen können. Ich halte dies für einen Vorteil, da ich sehr C # -zentriert bin und gerade dabei bin, Android / Java in eine große vorhandene .Net-Anwendung zu integrieren. Daher möchte ich meine C # -Klassen weiterhin als endgültige Strukturdefinitionen betrachten.
RenniePet
73

RPC ist ein weiterer wesentlicher Unterschied. Thrift generiert Code zur Implementierung von RPC-Clients und -Servern, wobei Protokollpuffer hauptsächlich als Datenaustauschformat konzipiert zu sein scheinen.

sagteimu apale
quelle
9
Das ist nicht wahr. Protokollpuffer definieren eine RPC-Dienst-API, und es stehen einige Bibliotheken zur Verfügung, um die Nachrichtenübergabe zu implementieren.
Stephen
7
Ich habe nicht gesagt, dass in Protobuf kein RPC definiert ist, nur dass es nicht dafür konzipiert zu sein scheint, zumindest nicht in der externen Version, auf die jeder Zugriff hat. Lesen Sie den Kommentar dieses Google-Ingenieurs hier
sagte
9
Noch wichtiger ist, dass in Thrift RPC-Unterstützung integriert ist. Protobuf stützt sich derzeit auf Bibliotheken von Drittanbietern, was weniger Augen, weniger Tests und weniger zuverlässigen Code bedeutet.
Alec Thomas
2
Für mich ist es ein guter Punkt bei ProtoBuf. Wenn Sie nur serialisieren müssen, fügen Sie keinen nutzlosen Code hinzu. Und wenn Sie es in Zukunft per RPC senden müssen, kein Problem, es kann funktionieren. Ich benutze Netty für das Netzwerk und Protobuf ist einfach perfekt integriert, also kein Problem, kein Test und maximale Leistung.
Kikiwa
14
Protobufs wurden in der Tat mit Blick auf RPC entwickelt. Google hat diese Komponente erst vor kurzem als Open-Source-Lösung
bereitgestellt
57
  • Protobuf-serialisierte Objekte sind etwa 30% kleiner als Thrift.
  • Die meisten Aktionen, die Sie möglicherweise mit Protobuf-Objekten ausführen möchten (Erstellen, Serialisieren, Deserialisieren), sind viel langsamer als Sparsamkeit, es sei denn, Sie aktivieren sieoption optimize_for = SPEED .
  • Thrift hat reichhaltigere Datenstrukturen (Map, Set)
  • Die Protobuf-API sieht sauberer aus, obwohl die generierten Klassen alle als innere Klassen gepackt sind, was nicht so schön ist.
  • Thrift-Enums sind keine echten Java-Enums, dh sie sind nur Ints. Protobuf hat echte Java-Enums.

Schauen Sie sich die Unterschiede im Quellcode dieses Open-Source-Projekts genauer an, um die Unterschiede genauer zu betrachten .

eishay
quelle
1
Schneller Vorschlag: Es wäre ordentlich, wenn ein anderes nicht-binäres Format (xml oder json?) Als Basis verwendet würde. Es gab keine guten Tests, die allgemeine Trends aufzeigen - es wird davon ausgegangen, dass PB und Thrift effizienter sind, aber ob und um wie viel, wenn ja, ist meistens eine offene Frage.
StaxMan
4
0,02 Sekunden?! Ich habe nicht so
Chris S
1
Jetzt, da Thrift mehrere Protokolle hat (einschließlich eines TCompactProtocol), denke ich, dass das erste Aufzählungszeichen nicht mehr gilt.
Janus Troelsen
13
Die Option für Geschwindigkeitsoptimierung ist jetzt die Standardeinstellung für Protokollpuffer ( code.google.com/apis/protocolbuffers/docs/proto.html )
Willem
5
Erhalten wir 30% kleinere Objekte mit "optimize_for = speed"? Oder ist das kompromittiert?
Prashant Sharma
56

Wie ich schon sagte "Thrift vs Protocol Puffer" Thema :

Bezugnehmend auf den Vergleich zwischen Thrift und Protobuf und JSON :

Darüber hinaus stehen für diese Lösungen viele interessante zusätzliche Tools zur Verfügung, die möglicherweise entscheiden. Hier einige Beispiele für Protobuf: Protobuf-Wireshark , Protobufeditor .

Grzegorz Wierzowiecki
quelle
10
Dies ist ein voller Kreis. Sie haben genau die gleiche Antwort auf drei (ähnliche) Fragen gepostet, die immer mit entweder oder verknüpft sind. Ich habe das Gefühl, ich spiele Zelda und habe ein Schild verpasst.
ChrisR
+ ChrisR heh, ich kann mich nicht erinnern, wie es passiert ist. Obwohl es einige ähnliche Fragen gab, sollte ich vielleicht drei ähnliche Strukturen anstelle von Zyklen erstellen. Eines Tages ... Es ist eine sehr alte Frage und jetzt antworte ich vom Telefon aus. Trotzdem danke fürs fangen!
Grzegorz Wierzowiecki
6
"Sparsamkeit kommt mit einem guten Tutorial" - wie lustig. Es ist das unvollständigste Tutorial, das ich je gesehen habe. Sobald Sie etwas neben TSimpleServer tun möchten, bleiben Sie dort stecken
Marian Klühspies
Thrift hat auch Wireshark Plugin: github.com/andrewcox/wireshark-with-thrift-plugin
CCoder
8

Protokollpuffer scheinen eine kompaktere Darstellung zu haben, aber das ist nur ein Eindruck, den ich beim Lesen des Thrift-Whitepapers bekomme. In ihren eigenen Worten:

Wir haben uns aus Gründen der Einfachheit und Klarheit des Codes gegen einige extreme Speicheroptimierungen entschieden (z. B. Packen kleiner Ganzzahlen in ASCII oder Verwenden eines 7-Bit-Fortsetzungsformats). Diese Änderungen können leicht vorgenommen werden, wenn wir auf einen leistungskritischen Anwendungsfall stoßen, der dies erfordert.

Es mag auch nur mein Eindruck sein, aber Protokollpuffer scheinen einige dickere Abstraktionen bezüglich der Strukturversionierung zu haben. Thrift bietet zwar einige Versionsunterstützung, erfordert jedoch einige Anstrengungen, um dies zu erreichen.

Daniel Spiewak
quelle
1
Warum lässt die Tatsache, dass Thrift zugibt, nicht so kompakt wie möglich zu sein, Sie glauben, dass es sich um Protokollpuffer handelt?
Michael Mior
1
Protokollpuffer verwenden eine Ganzzahlcodierung mit variabler Länge, sowohl für Werte als auch für Feldkennungen. Der häufigste Fall beim Senden eines int-Felds mit einem kleinen Wert sind also zwei Bytes, nicht int16 und int32.
Poolie
"Protokollpuffer verwenden eine Ganzzahlcodierung variabler Länge" - ebenso wie TCompactProtocol
JensG
8

Ich konnte mit einem textbasierten Protokoll eine bessere Leistung erzielen als mit Protobuff auf Python. Es gibt jedoch keine Typprüfung oder andere ausgefallene utf8-Konvertierung usw., die Protobuff anbietet.

Wenn Sie also nur Serialisierung / Deserialisierung benötigen, können Sie wahrscheinlich etwas anderes verwenden.

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

Dhruvbird
quelle
7

Eine offensichtliche Sache, die noch nicht erwähnt wurde, ist, dass sowohl ein Pro als auch ein Contra sein kann (und für beide gleich ist), dass es sich um binäre Protokolle handelt. Dies ermöglicht eine kompaktere Darstellung und möglicherweise mehr Leistung (Profis), jedoch mit verringerter Lesbarkeit (oder besser Debuggbarkeit), ein Nachteil.

Außerdem haben beide etwas weniger Tool-Unterstützung als Standardformate wie XML (und vielleicht sogar JSON).

(BEARBEITEN) Hier ist ein interessanter Vergleich , der sowohl Größen- als auch Leistungsunterschiede berücksichtigt und Zahlen für einige andere Formate (xml, json) enthält.

StaxMan
quelle
3
Es ist trivial, einen Protokollpuffer in einer Textdarstellung auszugeben, die für Menschen viel besser lesbar ist als XML: my_proto.DebugString (). Ein Beispiel finden Sie unter code.google.com/apis/protocolbuffers/docs/overview.html
SuperElectric
Das Gleiche gilt natürlich für alle Binärformate - aber das macht sie nicht so lesbar wie sie sind (Debug auf dem Draht). Schlimmer noch, für Protobuf benötigen Sie wirklich das Schema def, um Feldnamen zu kennen.
StaxMan
Thrift unterstützt verschiedene, sogar benutzerdefinierte Protokolle. Sie können Binär, Kompakt, JSON oder etwas verwenden, das Sie erst letzte Woche erfunden haben.
JensG
6

Und laut Wiki läuft die Thrift-Laufzeit nicht unter Windows.


quelle
5
Ich führe Thrift unter Windows erfolgreich aus. Verwenden Sie Windows Fork unter github.com/aubonbeurre/thrift
Sergey Podobry
20
Der offizielle Hauptzweig unterstützt jetzt auch Windows.
Janus Troelsen
5
@dalle - Alex P hat Boost-Thread-Unterstützung in Thrift hinzugefügt. Es ist jetzt das Standard-Threading für Windows. * NIX verwendet standardmäßig pthreads. Und um Janus T zu bestätigen, unterstützt Thrift jetzt Windows vollständig.
pmont
21
Dies sind veraltete Informationen. Thrift läuft jetzt schon lange perfekt unter Windows.
JensG
6

ProtocolBuffers ist SCHNELLER.
Hier gibt es einen schönen Benchmark:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

Vielleicht möchten Sie auch einen Blick auf Avro werfen, da Avro noch schneller ist.
Microsoft hat hier ein Paket:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro

Das schnellste, das ich je gesehen habe, ist übrigens Cap'nProto .
Die Implementierung von AC # finden Sie im Github-Repository von Marc Gravell .

Stefan Steiger
quelle
4

Ich denke, die meisten dieser Punkte haben die grundlegende Tatsache übersehen, dass Thrift ein RPC-Framework ist, das zufällig die Fähigkeit besitzt, Daten mit einer Vielzahl von Methoden (Binär, XML usw.) zu serialisieren.

Protokollpuffer sind nur für die Serialisierung konzipiert, es ist kein Framework wie Thrift.

Babra Cunningham
quelle
3
Was meinst du mit RPC-Framework und wie unterscheidet sich das von Protobufs gRPC ?
Marcelocra
gRPC wird nicht zusammen mit protobuf verpackt. Es wurde wie 10 Jahre später entwickelt. Thrift wird mit dem vollständigen RPC-Framework geliefert. Es wurde zusammen gemacht.
Trilogie
3

Zum einen ist protobuf keine vollständige RPC-Implementierung. Dazu ist so etwas wie gRPC erforderlich.

gPRC ist im Vergleich zu Thrift sehr langsam:

http://szelei.me/rpc-benchmark-part1/

Trilogie
quelle
0

Hier gibt es einige ausgezeichnete Punkte, und ich werde einen weiteren hinzufügen, falls sich hier jemandes Weg kreuzt.

Mit Thrift können Sie zwischen Thrift-Binary und Thrift-Compact (De) Serializer wählen. Thrift-Binary bietet eine hervorragende Leistung, aber eine größere Paketgröße, während Thrift-Compact eine gute Komprimierung bietet, aber mehr Rechenleistung benötigt. Dies ist praktisch, da Sie jederzeit so einfach zwischen diesen beiden Modi wechseln können wie das Ändern einer Codezeile (zum Teufel, sogar konfigurierbar machen). Wenn Sie sich nicht sicher sind, wie stark Ihre Anwendung für die Paketgröße oder die Verarbeitungsleistung optimiert werden soll, kann Sparsamkeit eine interessante Wahl sein.

PS: Sehen Sie sich dieses hervorragende Benchmark-Projekt an, bei thekvsdem viele Serializer verglichen werden, darunter Thrift-Binary, Thrift-Compact und Protobuf: https://github.com/thekvs/cpp-serializers

PS: Es gibt einen anderen Serializer namens, YASder diese Option ebenfalls bietet, aber ohne Schema ist (siehe Link oben).

Sinapse
quelle
0

Es ist auch wichtig zu beachten, dass nicht alle unterstützten Sprachen konsistent mit Sparsamkeit oder Protobuf übereinstimmen. An dieser Stelle geht es neben der zugrunde liegenden Serialisierung auch um die Implementierung des Moduls. Überprüfen Sie die Benchmarks auf die Sprache, die Sie verwenden möchten.

JSON
quelle