Quelles sont les principales différences entre Apache Thrift, Google Protocol Buffers, MessagePack, ASN.1 et Apache Avro?

StackOverflow https://stackoverflow.com/questions/4633611

Question

Tous ces éléments fournissent sérialisation binaire, les cadres RPC et IDL. Je suis intéressé par les principales différences entre les caractéristiques et (performance, facilité d'utilisation, prise en charge des langages de programmation).

Si vous connaissez d'autres technologies similaires, s'il vous plaît mentionner dans une réponse.

Était-ce utile?

La solution

ASN.1 est une norme ISO / ISE. Il a une langue source très lisible et une variété de back-end, à la fois binaire et lisible par l'homme. Être une norme internationale (et un ancien ça!) La langue source est une cuisine-sinkish bits (à peu près de la même façon que l'océan Atlantique est un peu humide), mais il est extrêmement bien spécifié et a quantité décente de soutien . (Vous pouvez probablement trouver une bibliothèque ASN.1 pour la langue que vous nommez si vous creusez assez dur, et sinon il y a de bonnes bibliothèques de langue C disponibles que vous pouvez utiliser dans IFF.) Il est, d'être un langage standardisé, de manière obsessionnelle documentée et a quelques bons tutoriels disponibles.

Thrift est pas une norme. Il est originaire de Facebook et a été plus tard open source et est actuellement un haut niveau projet Apache. Il est pas bien documenté - niveaux en particulier tutoriel - et à mon (certes brève) coup d'oeil ne semble pas ajouter quoi que ce soit que les autres, les efforts précédents ne le font pas (et dans certains cas mieux). Pour être juste envers, il a un nombre assez impressionnant de langues, il prend en charge hors de la boîte, y compris quelques-unes des plus non traditionnels plus médiatisés. Le IDL est aussi vaguement C comme.

Protocol Buffers n'est pas une norme. Il est un produit Google qui est libéré dans la communauté. Il est un peu limité en termes de langues prises en charge hors de la boîte (il ne supporte que C ++, Python et Java) mais il a beaucoup de soutien tiers pour d'autres langues (de qualité très variable). Google fait à peu près tout de leur travail en utilisant Buffers Protocole, il est donc une bataille testé, le protocole endurci (mais pas aussi aguerris que ASN.1 est. Il a beaucoup mieux que la documentation ne Thrift, mais, étant produit Google, il est très susceptible d'être instable (au sens de constante évolution, et non pas dans le sens de non fiable). l'IDL est également C-like.

Tous les systèmes ci-dessus utilisent un schéma défini dans une sorte de IDL pour générer du code pour une langue cible qui est ensuite utilisé dans le codage et le décodage. Avro ne fonctionne pas. La frappe de Avro est dynamique et ses données de schéma est utilisé lors de l'exécution directement à la fois pour coder et décoder (qui a des coûts évidents dans le traitement, mais aussi des avantages évidents vis-à-vis des langues de dynamique et l'absence d'un besoin de types de marquage, etc.) . Son schéma utilise JSON qui rend le soutien Avro dans une nouvelle langue un peu plus facile à gérer s'il y a déjà une bibliothèque JSON. Encore une fois, comme avec la plupart des systèmes de description protocole-réinvente la roue, Avro est également pas normalisée.

Personnellement, malgré ma relation amour / haine avec elle, je serais probablement utiliser ASN.1 pour la plupart des fins de transmission RPC et de message, bien qu'il ne soit pas vraiment une pile RPC (vous auriez à faire un, mais iOCs font que assez simple).

Autres conseils

Nous avons juste fait une étude interne sur serializers, voici quelques résultats (pour mon avenir référence aussi!)

Thrift = sérialisation + RPC pile

La plus grande différence est que Thrift est non seulement un protocole de sérialisation, il est une pile RPC soufflée complète qui est comme une pile SOAP moderne. Ainsi, après la sérialisation, les objets peut (mais pas obligatoire) être envoyé entre les machines sur TCP / IP. Dans SOAP, vous avez commencé avec un document WSDL décrivant en détail les services disponibles (méthodes à distance) et les arguments attendus / objets. Ces objets ont été envoyés via XML. Dans Thrift, le fichier .thrift décrit complètement les méthodes disponibles, les objets de paramètres attendus et les objets sont sérialisés par l'un des serializers disponibles (avec Compact Protocol, un protocole binaire efficace, étant le plus populaire dans la production).

ASN.1 = Grand-papa

ASN.1 a été conçu par des gens de télécommunications dans les années 80 et est maladroit à utiliser grâce à l'appui bibliothèque limitée par rapport aux serializers récentes qui ont émergé de gens compsci. Il existe deux variantes, DER (binaire) codant pour et PEM (ascii) encodage. Les deux sont rapides, mais DER est de taille plus rapide et plus efficace des deux. En fait ASN.1 DER peut facilement suivre (et parfois battre) serializers qui ont été conçus 30 ans après lui-même, un témoignage de son design bien conçu. Il est très compact, plus petit que protocole buffers et Thrift, seulement battu par Avro. La question est d'avoir de grandes bibliothèques à l'appui et en ce moment Bouncy Castle semble être le meilleur pour C # / Java. ASN.1 est roi dans les systèmes de sécurité et de crypto et ne va pas disparaître, alors ne soyez pas inquiet au sujet de « épreuvage avenir ». Procurez-vous une bonne bibliothèque ...

MessagePack = milieu du paquet

Il est pas mal, mais ce n'est ni le plus rapide, ni le plus petit, ni la meilleure prise en charge. Aucune raison de la production pour le sélectionner.

Commun

Au-delà, ils sont assez similaires. La plupart sont des variantes du principe de base TLV: Type-Length-Value.

Protocol Buffers (Google origine), Avro (Apache base, utilisé dans Hadoop), Thrift (Facebook est originaire, maintenant projet Apache) et ASN.1 (Telecom origine) impliquent tous un certain niveau de génération de code où vous exprimez d'abord vos données dans un format spécifique à sérialiseur, le sérialiseur « compilateur » va générer le code source de votre langue via la phase code-gen. Votre source d'application utilise ensuite ces classes code-gen pour IO. Notez que certaines implémentations (par exemple: la bibliothèque Avro de Microsoft ou Marc Gavel de ProtoBuf.NET) objets vous permettent de décorer directement votre niveau d'application POCO / POJO et la bibliothèque utilise directement les classes décorées au lieu de toutes les classes de codes-gen. Nous avons vu cette offre une performance boost car il élimine une étape de copie d'objet (à partir du niveau d'application des champs POCO / POJO aux champs de code gen).

Quelques résultats et un projet en direct à jouer avec

Ce projet ( https://github.com/sidshetye/SerializersCompare ) compare serializers importantes dans la C # monde. Les gens Java ont déjà quelque chose de similaire .

1000 iterations per serializer, average times listed
Sorting result by size
Name                Bytes  Time (ms)
------------------------------------
Avro (cheating)       133     0.0142
Avro                  133     0.0568
Avro MSFT             141     0.0051
Thrift (cheating)     148     0.0069
Thrift                148     0.1470
ProtoBuf              155     0.0077
MessagePack           230     0.0296
ServiceStackJSV       258     0.0159
Json.NET BSON         286     0.0381
ServiceStackJson      290     0.0164
Json.NET              290     0.0333
XmlSerializer         571     0.1025
Binary Formatter      748     0.0344

Options: (T)est, (R)esults, s(O)rt order, (S)erializer output, (D)eserializer output (in JSON form), (E)xit

Serialized via ASN.1 DER encoding to 148 bytes in 0.0674ms (hacked experiment!)

Ajout du point de vue de la performance, Uber a récemment évalué plusieurs de ces bibliothèques sur leur blog d'ingénierie:

https://eng.uber.com/trip-data-squeeze/

Le gagnant pour eux? MessagePack + zlib pour la compression

  

Notre objectif était de trouver la combinaison du protocole et encodage   algorithme de compression avec le résultat le plus compact au plus haut   la vitesse. Nous avons testé encodant protocole et algorithme de compression   combinaisons sur 2.219 voyages anonymisées pseudoaléatoires de Uber de New York   City (mettre dans un fichier texte JSON).

La leçon ici est que vos besoins en voiture quelle bibliothèque est bon pour vous. Pour Uber ils ne pouvaient pas utiliser un protocole basé sur IDL en raison de la nature du passage de messages sans schéma qu'ils ont. Cela a éliminé un tas d'options. Pour eux aussi, il est non seulement le codage brut / temps de décodage qui entre en jeu, mais la taille des données au repos.

Résultats de la taille

 Résultats de la taille

Vitesse Résultats

 entrer image description ici

La seule grande chose au sujet ASN.1 est, ce ist est conçu pour spécification pas mise en œuvre. Par conséquent, il est très bien se cacher / ignorer les détails de mise en œuvre dans une « vraie » langue la programmation.

Son travail du compilateur ASN.1 pour appliquer des règles de codage du asn1 fichier et générer à la fois d'entre eux un code exécutable. Les règles de codage pourrait être envisagé dans le codage Notation (ECN) ou peut-être l'un de ceux normalisés tels que BER / DER, PER, XER / EXER. C'est ASN.1 est les types et les structures, les règles de codage définissent le sur le codage de fil, et last but not least les transferts du compilateur à votre langage de programmation.

Les libres Compilateurs prennent en charge C, C ++, C #, Java et Erlang à ma connaissance. Le (beaucoup à cher et brevets / licences courues) compilateurs commerciaux sont très polyvalents, généralement tout à fait la mise à jour et d'appui aux langues parfois même plus, mais voient leurs sites (OSS Nokalva, Marben etc.).

Il est étonnamment facile de spécifier une interface entre les parties de cultures de programmation totalement différentes (par exemple, « embedded » personnes et les agriculteurs « serveur ».) À l'aide des techniques: un fichier ASN.1, la règle de codage par exemple BER et un exemple UML Interaction diagramme. No Worries sa mise en œuvre, permettent d'utiliser tout le monde « leur chose »! Pour moi, il a très bien fonctionné. BTW .: site de l'OSS à Nokalva vous pouvez trouver au moins deux livres free-to-téléchargement sur ASN.1 (un par l'autre Larmouth par Dubuisson).

à mon humble avis la plupart des autres produits ne connaissent que d'être encore-un-RPC-stub-générateurs, pompage beaucoup d'air dans la question de sérialisation. Eh bien, si on a besoin que, on pourrait bien. Mais pour moi, ils ressemblent à des réinventions de Sun-RPC (de la fin du 80e), mais, hé, qui a bien fonctionné, aussi.

Bond Microsoft ( https://github.com/Microsoft/bond ) est très impressionnant avec des performances , des fonctionnalités et de la documentation. Cependant, il ne supporte pas beaucoup de plates-formes cibles dès maintenant (13 février 2015). Je ne peux que supposer qu'il est parce qu'il est très nouveau. actuellement il supporte python, c # et C ++. Il est utilisé par MS partout. Je l'ai essayé, pour moi en tant que développeur c # en utilisant liaison est mieux que d'utiliser protobuf, mais je l'ai utilisé Thrift aussi bien, le seul problème que j'a été confronté à la documentation, je devais essayer beaucoup de choses à comprendre comment les choses sont faites.

Peu de ressources sur Bond sont comme suit ( https://news.ycombinator.com/item? id = 8866694 , https://news.ycombinator.com/item?id=8866848 , https://microsoft.github.io/bond/why_bond.html)

scroll top