it-swarm-eu.dev

Größte Unterschiede zwischen Thrift- und Protokollpuffern?

Was sind die größten Vor- und Nachteile von Apache Thrift vs Googles Protokollpuffer ?

256
Bob

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

  • Thrift unterstützt 'Ausnahmen'
  • Protokollpuffer haben viel bessere Dokumentation/Beispiele
  • Thrift hat einen eingebauten Set-Typ
  • Protokollpuffer erlauben "Erweiterungen" - Sie können ein externes Protokoll erweitern, um zusätzliche Felder hinzuzufügen, und gleichzeitig externen Code für die Verarbeitung der Werte zulassen. In Thrift ist dies nicht möglich
  • Ich finde Protokollpuffer viel einfacher zu lesen

Im Grunde sind sie ziemlich gleichwertig (mit Protokollpuffern etwas effizienter als ich gelesen habe).

145
hazzen

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

  • Protokollpuffer: 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

Beide könnten auf andere Plattformen erweitert werden, aber dies sind die Sprachbindungen, die standardmäßig verfügbar sind.

78
Mike Gray

RPC ist ein weiterer wesentlicher Unterschied. Thrift generiert Code zum Implementieren von RPC-Clients und -Servern, wobei die Protokollpuffer meist nur als Datenaustauschformat konzipiert sind.

68
saidimu apale
  • Serialisierte Objekte von Protobuf sind etwa 30% kleiner als Thrift.
  • Die meisten Aktionen, die Sie mit protobuf-Objekten ausführen möchten (Erstellen, Serialisieren, Deserialisieren), sind viel langsamer als Sparsamkeit , es sei denn, Sie aktivieren option optimize_for = SPEED
  • Thrift hat reichhaltigere Datenstrukturen (Map, Set)
  • 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, d. H. Protobuf hat echte Java-Enums.

Um die Unterschiede genauer zu betrachten, sehen Sie sich die Quellcode-Unterschiede unter dieses Open-Source-Projekt an.

56
eishay

Wie ich als "Thrift vs Protocol Puffer" Thema gesagt habe:

Bezug nehmend auf Thrift vs. Protobuf vs. JSON-Vergleich :

Darüber hinaus gibt es viele interessante zusätzliche Tools für diese Lösungen, die möglicherweise entscheiden. Hier sind Beispiele für Protobuf: Protobuf-Wireshark , Protobufeditor .

54

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

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

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

8
dhruvbird

Eine offensichtliche Sache, die noch nicht erwähnt wurde, ist, dass sowohl ein Pro als auch ein Con (und für beide gleich) ist, dass sie binäre Protokolle sind. Dies ermöglicht eine kompaktere Darstellung und möglicherweise mehr Leistung (Vorzüge), jedoch bei verminderter Lesbarkeit (bzw. Beeinträchtigung), was wiederum ein Nachteil ist.

Beide haben auch etwas weniger Werkzeugunterstützung als Standardformate wie XML (und vielleicht sogar Json).

(EDIT) Hier ist ein Interessanter Vergleich , der sowohl Größen- als auch Leistungsunterschiede anspricht und Zahlen für andere Formate (xml, json) enthält.

7
StaxMan

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 gegen einige extreme Speicheroptimierungen entschieden (d. H. Das Packen von kleinen Ganzzahlen in ASCII oder die Verwendung eines 7-Bit-Fortsetzungsformats) der Einfachheit und Klarheit des Codes halber. Diese Änderungen kann leicht gemacht werden, wenn wir auf eine leistungskritische Situation stoßen Anwendungsfall, der sie verlangt.

Es mag auch nur mein Eindruck sein, aber Protocol Buffers scheint einige dicke Abstraktionen über die Versionierung von Struktur zu haben. Thrift bietet zwar eine gewisse Versionierungsunterstützung, es erfordert jedoch ein wenig Aufwand, um dies zu ermöglichen.

7
Daniel Spiewak

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 in Avro nachsehen, da Avro noch schneller ist.
Microsoft hat hier ein Paket:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro ​​

Übrigens ist das schnellste, das ich je gesehen habe, Cap'nProto ;
Eine C # -Implementierung kann im Github-Repository von Marc Gravell gefunden werden.

6
Stefan Steiger

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

6
hplbsh

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

Protokollpuffer sind ausschließlich für die Serialisierung konzipiert, kein Framework wie Thrift. 

3

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

gPRC ist im Vergleich zu Thrift sehr langsam:

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

2
trilogy

Es ist auch wichtig zu beachten, dass nicht alle unterstützten Sprachen konsistent mit Thrift oder Protobuf sind. An dieser Stelle kommt es neben der zugrundeliegenden Serialisierung auf die Implementierung der Module. Achten Sie darauf, dass Sie die Benchmarks für die Sprache, die Sie verwenden möchten, überprüfen.

0
JSON

Es gibt hier einige hervorragende Punkte, und ich werde einen weiteren hinzufügen, falls sich jemandes Pfad kreuzt.

Mit Thrift haben Sie die Möglichkeit, zwischen thrift-binary und thrift-compact (de) -Serialisierer zu wählen. Thrift-binary hat eine hervorragende Leistung, aber eine größere Paketgröße, während thrift-compact eine gute Komprimierung bietet, jedoch mehr Verarbeitungsleistung erfordert. Dies ist praktisch, da Sie jederzeit zwischen diesen beiden Modi wechseln können, genauso wie das Ändern einer Codezeile (machen Sie es sogar konfigurierbar). Wenn Sie sich also nicht sicher sind, inwieweit Ihre Anwendung für die Paketgröße oder die Verarbeitungsleistung optimiert werden soll, kann Thrift eine interessante Wahl sein.

PS: Sehen Sie dieses ausgezeichnete Benchmark-Projekt von thekvs, das viele Serialisierer vergleicht, darunter Thrift-Binary, Thrift-Compact und Protobuf: https://github.com/thekvs/cpp-serializers

PS: Es gibt einen weiteren Serializer mit dem Namen YAS, der diese Option ebenfalls gibt, aber ohne Schema ist der Link oben zu sehen.

0
Sinapse