Was sind die größten Vor- und Nachteile von Apache Thrift gegenüber Googles Protokollpuffern ?
Was sind die größten Vor- und Nachteile von Apache Thrift gegenüber Googles Protokollpuffern ?
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).
map
auch
Ein 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.
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.
option optimize_for = SPEED
.Schauen Sie sich die Unterschiede im Quellcode dieses Open-Source-Projekts genauer an, um die Unterschiede genauer zu betrachten .
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 .
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.
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
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.
Und laut Wiki läuft die Thrift-Laufzeit nicht unter Windows.
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 .
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.
Zum einen ist protobuf keine vollständige RPC-Implementierung. Dazu ist so etwas wie gRPC erforderlich.
gPRC ist im Vergleich zu Thrift sehr langsam:
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-serializers
PS: Es gibt einen anderen Serializer namens, YAS
der 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.