121 votes

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

Tous ces fournissent la sérialisation binaire, cadres RPC et IDL. Je suis intéressé par des différences clés entre eux et caractéristiques (performances, facile d’utilisation, prise en charge du langage de programmation).

Si vous connaissez une autre technologie similaire, indiquez-le dans les réponses.

95voto

L'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 ancienne!) 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.

L'épargne n'est pas une norme. Il est à l'origine de Facebook et a été plus tard open-source et est actuellement dans l'incubateur Apache (où il a été depuis 2008, de sorte qu'il semble se déplacer très lentement.) 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-traditionnels. L'IDL est aussi vaguement C-like.

Tampons de protocole 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 ces systèmes 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 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).

37voto

DeepSpace101 Points 1973

Nous avons juste fait une étude interne sur les sérialiseurs, voici quelques résultats (pour ma future référence de trop!)

Thrift = 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 pourraient (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, les paramètres attendus 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).

L'ASN.1 = Grand papa

L'ASN.1 a été conçu par telecom gens dans les années 80 et est inconfortable à 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 de 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 l' code-gen de phase. Votre application source utilise ensuite ces code-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).

Quelques résultats et un projet de live pour jouer avec

Ce projet (https://github.com/sidshetye/SerializersComparecompare important sérialiseurs dans le C# du monde. La Java des gens 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!)

11voto

njimko Points 101

Une grande chose au sujet de l'ASN.1 est, que les ist est conçu pour la spécification de la non 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.

Le gratuit 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.

5voto

StaxMan Points 34626

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 JAMAIS prendre les auteurs de " 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, de conception modulaire, qui est, la 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X