Quelles sont les principales différences entre Apache Épargne, Google Protocol Buffers, MessagePack, l'ASN.1 et Apache Avro?
Ils assurent la sérialisation binaire, RPC cadres et IDL. Je suis intéressé dans les principales différences entre eux et les caractéristiques de performance (performance, facilité d'utilisation, les langages de programmation à l'appui).
Si vous en connaissez d'autres technologies similaires, veuillez le mentionner dans la réponse.
- en.wikipedia.org/wiki/Comparison_of_data_serialization_formats
- Ce lien n'a pas toute l'information pour les 2 à 5 interrogé formats.
- pourrait aider: slideshare.net/IgorAnishchenko/pb-vs-thrift-vs-avro ?
- pour ceux qui ne savent pas RPC - Distance Prodecure Appel, IDL - langage de Définition d'Interface
Vous devez vous connecter pour publier un commentaire.
ASN.1 est une norme ISO/ISE standard. Il a une très lisible de la langue source et une variété de back-ends, à la fois binaire et lisible par l'homme. Être une norme internationale (et une vieille à cela!) la langue source est un peu de cuisine-sinkish (dans près de la même manière que l'Océan Atlantique est un peu humide), mais il est extrêmement bien spécifié et a bonne quantité de soutien. (Vous pouvez probablement trouver une ASN.1 bibliothèque pour la langue de votre nom si vous creusez assez dur, et si non il y a des bonnes langage C les bibliothèques disponibles que vous pouvez utiliser dans les Ife.) C'est un langage normalisé, de manière obsessionnelle, documentée et a quelques bons tutoriels disponibles en tant que bien.
Épargne n'est pas un standard. Il est à l'origine de Facebook et a été plus tard open-source et est actuellement un haut niveau d'Apache projet. Il n'est pas bien documentée, surtout tutoriel niveaux, et à mon (certes courte) coup d'œil ne semble pas ajouter quoi que ce soit que d'autres, des efforts précédents ne le faites pas déjà (et, dans certains cas, de mieux en mieux). Pour être juste, il a plutôt un nombre impressionnant de langues, il prend en charge hors de la boîte, y compris quelques-uns des plus-profil non générale. L'IDL est aussi vaguement C-like.
Protocol Buffers n'est pas un standard. C'est un produit de Google est disponible à l'ensemble de la communauté. C'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 de tiers pour les autres langues (de très qualité variable). Google fait à peu près la totalité de leur travail à l'aide de Tampons de Protocole, de sorte qu'il est une bataille, l'épreuve du aguerris protocole (mais pas aussi aguerris que ASN.1 est. Il a beaucoup plus de documentation que l'Épargne, mais, étant un produit de Google, il est très susceptible d'être instable (dans le sens de la constante évolution, non pas dans le sens de peu fiable). L'IDL est également C-like.
Tous les systèmes ci-dessus l'utilisation d'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 le fait pas. Avro typage est dynamique et son schéma de données est utilisé lors de l'exécution directement à la fois pour coder et décoder (qui a un peu de coûts les plus évidents, dans la transformation, mais aussi des avantages évidents vis-à-vis de la dynamique des langues et de l'absence d'un besoin pour le marquage des types, etc.). Son schéma utilise JSON qui rend l'appui Avro dans une nouvelle langue, un peu plus facile à gérer si il y a déjà une librairie JSON. Encore une fois, comme avec la plupart des roues de réinventer le protocole de description des systèmes, Avro est pas normalisée.
Personnellement, malgré ma relation d'amour/haine avec elle, je serais probablement utiliser l'ASN.1 pour la plupart des RPC et de transmission de message, mais il n'a pas vraiment d'avoir un RPC de la pile (vous auriez à faire un, mais IOCs faire simple).
...
marqueurs de l'extension ou automatique parEXTENSIBILITY IMPLIED
dans l'en-tête du module. Protocol Buffers, IIRC, supporte le manuel de contrôle de version. Je ne sais pas si elle prend en charge quoi que ce soit comme implicite d'extensibilité (et je suis trop paresseux pour chercher). L'épargne prend également en charge certaines versions, mais encore une fois il me frappe comme un processus manuel sans l'implicite de l'extensibilité.EXTENSIBILITY IMPLIED
.Nous venons de faire une étude interne sur les sérialiseurs, voici quelques résultats (pour ma future référence trop!)
Épargne = sérialisation + RPC pile
La plus grande différence est que l'Épargne n'est pas seulement une sérialisation protocole, c'est une véritable RPC pile qui est comme un jour moderne pile de SAVON. Ainsi, après la sérialisation, les objets pourrait (mais pas obligatoire) être envoyés entre les machines sur TCP/IP. Dans la fabrication de SAVON, vous avez commencé avec un document WSDL qui décrit en détail les services disponibles (méthodes à distance) et les arguments attendus/objets. Ces objets ont été envoyés via XML. Dans l'Épargne, de l' .l'épargne fichier décrit en détail les méthodes disponibles, paramètre attendu des objets et les objets sont sérialisés par l'un des sérialiseurs (avec
Compact Protocol
, l'efficacité du protocole binaire, étant le plus populaire dans la production).ASN.1 = Grand papa
ASN.1 a été conçu par telecom gens dans les années 80 et est maladroit à utiliser en raison de la limitation de la bibliothèque de support par rapport à la récente sérialiseurs qui a émergé à partir de fac d'informatique gens. Il y a deux variantes, DER (binaire) de codage et de PEM (ascii) codage. Les deux sont rapides, mais DER est plus rapide et plus la taille efficace des deux. En fait l'ASN.1 DER pouvez facilement suivre (et parfois battre) sérialiseurs qui ont été conçus 30 ans après lui-même, un témoignage c'est bien la conception d'ingénierie. Il est très compact, plus petit que le Protocole de Tampons et de l'Épargne, seulement battu par Avro. La question est d'avoir de grandes bibliothèques à l'appui et à droite maintenant, Château Gonflable semble être la meilleure pour C#/Java. L'ASN.1 est le roi en matière de sécurité et de chiffrement des systèmes et ne va pas s'en aller, afin de ne pas être inquiet sur l'avenir de vérification linguistique'. Juste obtenir une bonne bibliothèque...
MessagePack = milieu de la meute
Il n'est pas mauvais mais ce n'est ni le plus rapide, ni la plus petite ni la meilleure prise en charge. Pas de production en raison de la choisir.
Commune
Au-delà, ils sont assez semblables. La plupart sont des variantes de la base
TLV: Type-Length-Value
principe.Protocol Buffers (Google est originaire), Avro (basé sur Apache, utilisé dans Hadoop), l'économie (Facebook originaire, maintenant Apache project) et de l'ASN.1 (Telecom origine) toutes impliquent un certain niveau de génération de code où vous tout d'abord exprimer vos données dans un sérialiseur-format spécifique, puis le sérialiseur "compilateur" va générer du code source de votre langue à l'aide de la
code-gen
phase. Votre application source utilise ensuite cescode-gen
des classes pour les IO. Notez que certaines mises en œuvre (par exemple: Microsoft Avro bibliothèque ou Marc Maillet de ProtoBuf.NET) laissez-vous directement décorer votre application niveau POCO/POJO des objets et de la bibliothèque utilise directement ces décorées classes à la place de n'importe quel code-gen de classes. Nous avons vu ce qui offre un coup de pouce de la performance car il élimine une copie d'objet stage (à partir du niveau d'application POCO/POJO champs de code-gen champs).Certains résultats et un projet de live pour jouer avec
Ce projet (https://github.com/sidshetye/SerializersCompare) compare important sérialiseurs dans le C# du monde. La Java des gens ont déjà quelque chose de similaire.
Ajoutant le point de vue des performances, Uber a récemment évalué plusieurs de ces bibliothèques sur leur blog:
https://eng.uber.com/trip-data-squeeze/
Le gagnant pour eux? MessagePack + zlib pour la compression
La leçon ici est que vos exigences de lecteur de la bibliothèque est bon pour vous. Pour Uber, ils ne pouvaient pas utiliser un IDL basée sur le protocole en raison de la schemaless la nature de la transmission de messages qu'ils ont. Cela a éliminé un tas d'options. Aussi, pour eux, c'est pas le seul cru de codage/décodage de temps qui entre en jeu, mais la taille des données au repos.
Résultats De La Taille
Vitesse De Résultats
Une grande chose au sujet de l'ASN.1 est, que les ist est conçu pour spécification pas mise en œuvre. Par conséquent, il est très bon à cacher/ignorer détail de l'implémentation dans une "vraie" programmation de la langue.
Son le travail de l'ASN.1-Compilateur pour appliquer des Règles d'Encodage de l'asn1-fichier et de générer des deux à la fois du code exécutable. Les Règles de Codage peut être donné dans le Codage de la Notation (ECN) ou peut-être l'un des standardisées telles que la BRE/DER, PAR, XER/EXER.
C'est l'ASN.1 est les Types et les Structures, les Règles de Codage de définir les sur le fil de l'encodage, et dernier mais pas moins que le Compilateur les transfère à votre langage de programmation.
La libre Compilateurs C,C++,C#,Java, et Erlang, à ma connaissance. Le (beaucoup de cher et de brevets/licences monté) compilateurs commerciaux sont très polyvalents, en général absolument up-to-date et parfois un soutien encore plus de langues, mais voir leur site (OSS Nokalva, Marben, etc.).
Il est étonnamment facile de spécifier une interface entre les parties de totalement différent de la programmation des cultures (par exemple. "embedded" et "serveur" agriculteurs) à l'aide de cette technique: une asn.1-fichier, les règles de Codage par exemple, BER et une par exemple UML Diagramme d'Interaction. Pas de Soucis la façon dont il est mis en œuvre, que tout le monde utilisent "leur chose"! Pour moi il a très bien fonctionné.
Btw.: OSS Nokalva du site, vous pouvez trouver au moins deux gratuit-télécharger des livres à propos de l'ASN.1 (un par Larmouth l'autre par Dubuisson).
À mon humble avis, la plupart des autres produits essayez seulement d'être encore un autre-RPC-stub-générateurs, de pompage beaucoup d'air dans la sérialisation question. Eh bien, si l'on a besoin, on peut être bien. Mais pour moi, ils ressemblent à des reinventions de Sun-RPC (à partir de la fin des années 80), mais, hé, qui a bien fonctionné, trop.
Microsoft Obligataire (https://github.com/Microsoft/bond) est très impressionnant avec des performances, des fonctionnalités et de la documentation. Cependant, il n'est pas en charge de nombreuses plates-formes cible dès maintenant ( 13 février 2015 ). Je ne peux que supposer que c'est parce que c'est très nouveau. actuellement, il prend en charge python, c# et c++ . Il est utilisé par MS partout. Je l'ai essayé, pour moi en tant que développeur c# à l'aide de bond est mieux que d'utiliser protobuf, toutefois, j'ai utilisé l'épargne ainsi, le seul problème que j'ai été confronté a été avec la documentation, j'ai dû essayer beaucoup de choses à comprendre comment les choses sont faites.
Peu de ressources Obligataires 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 )
Pour la performance, un seul point de données est jvm-sérialiseurs de référence-c'est assez spécifique, des petits messages, mais pourrait aider si vous êtes sur la plate-forme Java. Je pense que les performances en général souvent de ne pas être la différence la plus importante. Aussi: ne prenez JAMAIS des auteurs des paroles d'évangile; de nombreuses publicités sont faux (msgpack site, par exemple, a certaines revendications douteuses; il peut être rapide, mais les informations sont très sommaires, des cas d'utilisation pas très réaliste).
Une grande différence est qu'un schéma doit être utilisé (PB, Épargne au moins; Avro il peut être facultatif; l'ASN.1 je pense aussi; MsgPack, pas nécessairement).
Aussi: à mon avis, il est bon d'être en mesure d'utiliser des couches, conception modulaire, qui est, couche RPC ne doit pas dicter le format de données, de la sérialisation. Malheureusement, la plupart des candidats ne étroitement regrouper ces.
Enfin, lors du choix de format de données, de nos jours, la performance n'exclut pas l'utilisation de formats textuels. Il y a des ultra-rapide JSON analyseurs (et assez rapide streaming parseurs xml); et lorsque l'on considère l'interopérabilité des langages de script et la facilité d'utilisation, les formats binaires et des protocoles peut être pas le meilleur choix.