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).
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.
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.
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.
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.
Thrift wird unter der Apache 2-Lizenz veröffentlicht
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 .
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
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.
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.
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.
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.
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.
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.
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.
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).
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.
Antworten:
Beide bieten viele der gleichen Funktionen. Es gibt jedoch einige Unterschiede:
Set
TypGrundsätzlich sind sie ziemlich gleichwertig (mit Protokollpuffern etwas effizienter als ich gelesen habe).
quelle
map
auchEin weiterer wichtiger Unterschied sind die standardmäßig unterstützten Sprachen.
Beide können auf andere Plattformen erweitert werden, dies sind jedoch die sofort verfügbaren Sprachbindungen.
quelle
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.
quelle
option optimize_for = SPEED
.Schauen Sie sich die Unterschiede im Quellcode dieses Open-Source-Projekts genauer an, um die Unterschiede genauer zu betrachten .
quelle
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 .
quelle
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:
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.
quelle
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
quelle
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.
quelle
Und laut Wiki läuft die Thrift-Laufzeit nicht unter Windows.
quelle
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 .
quelle
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.
quelle
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/
quelle
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
thekvs
dem viele Serializer verglichen werden, darunter Thrift-Binary, Thrift-Compact und Protobuf: https://github.com/thekvs/cpp-serializersPS: Es gibt einen anderen Serializer namens,
YAS
der diese Option ebenfalls bietet, aber ohne Schema ist (siehe Link oben).quelle
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.
quelle