Les plus grandes différences de Thrift vs Protocol Buffers?

286

Quels sont les principaux avantages et inconvénients d' Apache Thrift par rapport aux tampons de protocole de Google ?

Jonas
la source
4
En guise de remarque, Marc Gravell maintient une bibliothèque pour travailler avec Googles protobuf appelée protobuf.net et elle se trouve sur code.google.com/p/protobuf-net
RCIX le
5
Cette question et certaines des réponses suivantes ont environ 6 ans. Beaucoup de choses ont probablement changé depuis.
AlikElzin-kilaka du

Réponses:

159

Ils offrent tous deux les mêmes fonctionnalités; cependant, il existe quelques différences:

  • Thrift prend en charge les «exceptions»
  • Les tampons de protocole ont une bien meilleure documentation / exemples
  • Thrift a un Settype intégré
  • Les tampons de protocole autorisent les "extensions" - vous pouvez étendre une proto externe pour ajouter des champs supplémentaires, tout en permettant au code externe d'opérer sur les valeurs. Il n'y a aucun moyen de le faire dans Thrift
  • Je trouve les tampons de protocole beaucoup plus faciles à lire

Fondamentalement, ils sont assez équivalents (avec des tampons de protocole légèrement plus efficaces que ce que j'ai lu).

hazzen
la source
16
Cette présentation les explique bien à partir de 2013 slideshare.net/IgorAnishchenko/pb-vs-thrift-vs-avro
BAR
13
l'épargne prend en charge comme 10 autres langues
Elijah Saounkine
1
Pour certaines langues, vous pouvez ajouter des extensions. Par exemple, Thrift génère des classes partielles pour C # qui sont faciles à étendre. Cependant, ce n'est pas la règle générale, c'est vrai.
JensG
grpc 1.0 (proto3) support mapégalement
KindDragon
85

Une autre différence importante réside dans les langues prises en charge par défaut.

  • Tampons de protocole: 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

Les deux pourraient être étendus à d'autres plates-formes, mais ce sont les liaisons de langues disponibles dès le départ.

Mike Gray
la source
16
protobuf a un excellent support ruby github.com/macks/ruby-protobuf et code.google.com/p/ruby-protobuf . J'utilise protobuf de C # (3.5) et Ruby, C # sérialise les données et, si nécessaire, Ruby désérialise et travaille sur la tâche.
Bryan Bailliache
6
code.google.com/p/protobuf/wiki/ThirdPartyAddOns répertorie PHP, Ruby, Erlang, Perl, Haskell, C #, OCaml plus Actiona Script, Common Lisp, Go, Lua, Mathlab, Visual Basic, Scala. Je pensais que ce sont toutes des implémentations tierces.
Igor Gatis
vous pouvez utiliser directement les fichiers protobuf C ++ dans l'objectif c (pour iOS et OS X) vérifier ce qn
Tushar Koul
Je vois que code.google.com/p/protobuf-net est souvent mentionné comme un port protobuf pour C #, mais ce n'est pas complètement vrai. L'une des caractéristiques importantes de Protobuf et Thrift est la définition de la structure externe, de sorte que la même définition peut être utilisée par différents langages. protobuf-net ne prend pas en charge cette fonctionnalité car il intègre la définition de la structure dans le code C #.
Andriy Tylychko
@AndyT: C'est discutable - cela dépend si c'est un avantage que la définition de la structure soit EXTERNE à toutes les langues que vous souhaitez prendre en charge. Avec protobuf-net, vous définissez votre structure de données en C # et générez le fichier .proto à partir de celui-ci, qui peut ensuite être utilisé pour créer le support dans les autres langues. Je considère que c'est un avantage, car je suis très orienté C # et je suis en train d'intégrer Android / Java avec une grande application .Net existante. Je veux donc continuer à considérer mes classes C # comme les définitions définitives de la structure.
RenniePet
73

RPC est une autre différence clé. Thrift génère du code pour implémenter les clients et serveurs RPC où les tampons de protocole semblent principalement conçus comme un format d'échange de données seul.

saidimu apale
la source
9
Ce n'est pas vrai. Les tampons de protocole définissent une API de service RPC et certaines bibliothèques sont disponibles pour implémenter la transmission des messages.
Stephen
7
Je n'ai pas dit que Protobuf n'a pas de RPC défini, juste qu'il ne semble pas avoir été conçu pour cela, du moins pas la version externe à laquelle tout le monde a accès. Lisez le commentaire de cet
saidimu apale
9
Plus important encore, Thrift a un support RPC intégré. Protobuf s'appuie actuellement sur des bibliothèques tierces, ce qui signifie moins d'yeux, moins de tests, moins de code fiable.
Alec Thomas
2
Pour moi, c'est un bon point sur ProtoBuf. Si vous devez uniquement sérialiser, vous n'ajoutez pas de code inutile. Et si à l'avenir, vous devez l'envoyer par RPC, pas de problème, cela peut fonctionner. J'utilise Netty pour le réseau, et Protobuf est juste parfaitement intégré, donc pas de problème, pas de test, et maximisez les performances.
Kikiwa
14
Les protobufs ont en fait été conçus en pensant au RPC. Google vient d'ouvrir ce composant assez récemment - grpc.io
andybons
57
  • Les objets sérialisés Protobuf sont environ 30% plus petits que Thrift.
  • La plupart des actions que vous voudrez peut-être effectuer avec des objets protobuf (créer, sérialiser, désérialiser) sont beaucoup plus lentes que l'épargne, sauf si vous les activez option optimize_for = SPEED.
  • Thrift a des structures de données plus riches (carte, ensemble)
  • L'API Protobuf semble plus propre, bien que les classes générées soient toutes regroupées en tant que classes internes, ce qui n'est pas si agréable.
  • Les énumérations d'épargne ne sont pas de véritables énumérations Java, c'est-à-dire qu'elles ne sont que des entiers. Protobuf possède de véritables énumérations Java.

Pour regarder de plus près les différences, consultez les différences de code source dans ce projet open source .

eishay
la source
1
Suggestion rapide: ce serait bien s'il y avait un autre format non binaire (xml ou json?) Utilisé comme ligne de base. Il n'y a pas eu de bons tests qui montrent des tendances générales - l'hypothèse est que PB et Thrift sont plus efficaces, mais si et dans quelle mesure, si c'est principalement une question ouverte.
StaxMan
4
0,02 secondes?! Je n'ai pas ce genre de temps libre
Chris S
1
Maintenant que Thrift a plusieurs protocoles (dont un TCompactProtocol), je pense que la première puce ne s'applique plus.
Janus Troelsen
13
L'option Optimiser pour la vitesse est désormais la valeur par défaut pour les tampons de protocole ( code.google.com/apis/protocolbuffers/docs/proto.html )
Willem
5
Obtenons-nous des objets 30% plus petits avec le jeu "Optimize_for = speed"? Ou qui est compromis?
Prashant Sharma
56

Comme je l'ai dit sous la rubrique "Thrift vs Protocol buffers" :

Se référant à la comparaison Thrift vs Protobuf vs JSON :

En outre, il existe de nombreux outils supplémentaires intéressants disponibles pour ces solutions, qui pourraient décider. Voici des exemples pour Protobuf: Protobuf-wirehark , protobufeditor .

Grzegorz Wierzowiecki
la source
10
Maintenant, c'est un cercle complet. Vous avez posté la même réponse exacte à trois questions (similaires) toujours liées à ou. J'ai l'impression de jouer à Zelda et j'ai raté un signe.
ChrisR
+ ChrisR heh, je ne me souviens pas comment c'est arrivé. Bien qu'il y ait eu quelques questions similaires, je devrais peut-être en faire trois comme une structure au lieu d'un cycle. Un jour ... C'est une très vieille question et maintenant je réponds par téléphone. Quoi qu'il en soit, merci pour la capture!
Grzegorz Wierzowiecki
6
"Thrift est livré avec un bon tutoriel" - comme c'est drôle. C'est le tutoriel le plus incomplet que j'ai jamais vu. Dès que vous voulez faire quelque chose à côté de TSimpleServer, vous êtes coincé là
Marian Klühspies
Thrift a également le plugin Wireshark: github.com/andrewcox/wireshark-with-thrift-plugin
CCoder
8

Les tampons de protocole semblent avoir une représentation plus compacte, mais ce n'est qu'une impression que j'ai en lisant le livre blanc Thrift. Dans leurs propres mots:

Nous avons opté pour des optimisations de stockage extrêmes (c.-à-d. Empaqueter de petits entiers en ASCII ou utiliser un format de continuation 7 bits) pour des raisons de simplicité et de clarté dans le code. Ces modifications peuvent facilement être apportées si et quand nous rencontrons un cas d'utilisation critique en termes de performances qui les exige.

En outre, cela peut juste être mon impression, mais les tampons de protocole semblent avoir des abstractions plus épaisses autour du versionnement des structures. Thrift prend en charge la gestion des versions, mais il faut un peu d'effort pour y arriver.

Daniel Spiewak
la source
1
Pourquoi le fait que Thrift admette ne pas être aussi compact que possible vous fait-il croire que les tampons de protocole le sont?
Michael Mior
1
Les tampons de protocole utilisent un codage entier de longueur variable, à la fois pour les valeurs et pour les identificateurs de champ. Ainsi, le cas très courant d'envoi d'un champ int avec une petite valeur sera de deux octets, pas un int16 et un int32.
poolie
"Les tampons de protocole utilisent un codage entier de longueur variable" - TCompactProtocol aussi
JensG
8

J'ai pu obtenir de meilleures performances avec un protocole basé sur du texte par rapport à protobuff sur python. Cependant, aucune vérification de type ou autre conversion utf8 fantaisie, etc ... qu'offre protobuff.

Donc, si la sérialisation / désérialisation est tout ce dont vous avez besoin, vous pouvez probablement utiliser autre chose.

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

dhruvbird
la source
7

Une chose évidente non encore mentionnée est que ce peut être à la fois un avantage ou un inconvénient (et c'est la même chose pour les deux), ce sont des protocoles binaires. Cela permet une représentation plus compacte et peut-être plus de performances (pros), mais avec une lisibilité réduite (ou plutôt, un débogage), un con.

En outre, les deux ont un support d'outil un peu moins important que les formats standard comme xml (et peut-être même json).

(MODIFIER) Voici une comparaison intéressante qui aborde à la fois les différences de taille et de performances, et inclut également des chiffres pour certains autres formats (xml, json).

StaxMan
la source
3
Il est trivial de sortir un tampon de protocole dans une représentation textuelle beaucoup plus lisible par l'homme que XML: my_proto.DebugString (). Pour un exemple, voir code.google.com/apis/protocolbuffers/docs/overview.html
SuperElectric
Bien sûr, idem pour tous les formats binaires - mais cela ne les rend pas lisibles tels quels (débogage sur le fil). Pire, pour protobuf, vous avez vraiment besoin du schéma def pour connaître les noms de champs.
StaxMan
Thrift prend en charge différents protocoles, même définis par l'utilisateur. Vous pouvez utiliser binaire, compact, json ou quelque chose que vous avez inventé la semaine dernière.
JensG
6

Et selon le wiki, le runtime Thrift ne fonctionne pas sur Windows.


la source
5
J'exécute Thrift sur Windows avec succès. Utilisez Windows Fork
Sergey Podobry
20
La branche officielle de la ligne principale prend désormais également en charge Windows.
Janus Troelsen
5
@dalle - Alex P a ajouté le support du thread Boost dans Thrift. Il s'agit désormais du filetage par défaut pour Windows. * NIX utilise par défaut pthreads. Et pour confirmer Janus T, Thrift prend désormais entièrement en charge Windows.
pmont
21
Il s'agit d'informations périmées. Thrift fonctionne parfaitement sur Windows depuis longtemps.
JensG
6

ProtocolBuffers est PLUS RAPIDE.
Il y a une belle référence ici:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

Vous pourriez également vouloir examiner Avro, car Avro est encore plus rapide.
Microsoft a un package ici:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro

Soit dit en passant, le plus rapide que j'ai jamais vu est Cap'nProto ;
L'implémentation AC # se trouve dans le dépôt Github de Marc Gravell .

Stefan Steiger
la source
4

Je pense que la plupart de ces points ont manqué le fait fondamental que Thrift est un framework RPC, qui a la capacité de sérialiser des données en utilisant une variété de méthodes (binaire, XML, etc.).

Les tampons de protocole sont conçus uniquement pour la sérialisation, ce n'est pas un cadre comme Thrift.

Babra Cunningham
la source
3
Qu'entendez-vous par framework RPC et en quoi est-ce différent du gRPC de protobuf ?
marcelocra
gRPC n'est pas fourni avec protobuf. Il a été développé comme 10 ans après. Thrift est livré avec le framework RPC complet. C'était fait ensemble.
trilogie
3

D'une part, protobuf n'est pas une implémentation RPC complète. Il faut quelque chose comme gRPC pour l'accompagner.

gPRC est très lent par rapport à Thrift:

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

trilogie
la source
0

Il y a d'excellents points ici et je vais en ajouter un autre au cas où le chemin de quelqu'un se croiserait ici.

Thrift vous donne la possibilité de choisir entre le sérialiseur thrift-binary et thrift-compact (de), thrift-binary aura une excellente performance mais une plus grande taille de paquet, tandis que thrift-compact vous donnera une bonne compression mais a besoin de plus de puissance de traitement. C'est pratique car vous pouvez toujours basculer entre ces deux modes aussi facilement que de changer une ligne de code (diable, même la rendre configurable). Donc, si vous n'êtes pas sûr du niveau d'optimisation de votre application pour la taille des paquets ou la puissance de traitement, l'épargne peut être un choix intéressant.

PS: Voir cet excellent projet de référence thekvsqui compare de nombreux sérialiseurs, y compris thrift-binary, thrift-compact et protobuf: https://github.com/thekvs/cpp-serializers

PS: Il existe un autre sérialiseur nommé YASqui donne également cette option mais il est sans schéma, voir le lien ci-dessus.

Sinapse
la source
0

Il est également important de noter que toutes les langues prises en charge ne sont pas compatibles avec thrift ou protobuf. À ce stade, il s'agit de l'implémentation des modules en plus de la sérialisation sous-jacente. Prenez soin de vérifier les repères pour la langue que vous prévoyez d'utiliser.

JSON
la source