Was sind die wichtigsten Unterschiede zwischen Apache Thrift, Google Protocol Buffers, Message, ASN.1 und Apache Avro?

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

Frage

All diese bieten binäre Serialisierung, RPC-Frameworks und IDL. Ich habe Interesse an wichtigen Unterschieden zwischen ihnen und Eigenschaften (Leistung, einfacher Bedienung, Programmiersprachen-Unterstützung).

Wenn Sie irgendwelche anderen ähnlichen Technologien kennen, fügen Sie es in einer Antwort erwähnen.

War es hilfreich?

Lösung

ASN.1 ist ein ISO / ISE-Standard. Es hat eine sehr lesbare Quellsprache und eine Vielzahl von Back-Ends, sowohl binär und in lesbare Form. einen internationalen Standard zu sein (und ein altes an!) die Quellsprache ist ein bisschen Küchen sinkish (in etwa die gleiche Art und Weise, dass der Atlantik ein bisschen nass ist), aber es ist sehr gut angegeben und hat ordentliche Menge an Unterstützung . (Sie können sich wahrscheinlich eine ASN.1-Bibliothek für jede Sprache finden Sie nennen, wenn man hart genug graben, und wenn nicht, gibt es eine gute Sprache C-Bibliotheken zur Verfügung, die Sie in FFIs verwenden können.) Es ist eine standardisierte Sprache zu sein, obsessiv dokumentiert und hat ein paar gute Lektionen zur Verfügung.

Thrift ist kein Standard. Es ist ursprünglich von Facebook und war später als Open-Source und ist derzeit ein Top-Level-Apache-Projekt. Es ist nicht gut dokumentiert - insbesondere Tutorial-Level - und zu meinem (zugegebenermaßen kurzen) Blick scheint nichts hinzuzufügen, dass auch andere, nicht bisherige Bemühungen nicht bereits tun (und in einigen Fällen besser). Um fair zu sein, um es, hat es eine ziemlich beeindruckende Zahl von Sprachen der Box ein paar der höheren Profil Nicht-Mainstream diejenigen, einschließlich unterstützt werden. Die IDL ist auch vage C-like.

Protocol Buffers ist kein Standard. Es ist ein Google-Produkt, das auf die breitere Gemeinschaft freigegeben wird. Es ist ein wenig begrenzt in Bezug auf die Sprachen der Box unterstützt aus (es unterstützt nur C ++, Python und Java), aber es tut für andere Sprachen eine Menge von Drittanbietern Unterstützung haben (von sehr unterschiedlicher Qualität). Google tut so ziemlich alle ihre Arbeit Protocol Buffers verwenden, so ist es ein kampferprobt ist, kampferprobter Protokoll (wenn auch nicht als kampferprobter als ASN.1 ist. Es hat viel bessere Dokumentation als Thrift tut, aber, ist ein Google-Produkt, es ist sehr wahrscheinlich, instabil zu sein (im Sinne von sich ständig verändernden, nicht im Sinne unzuverlässig). die IDL ist auch C-like.

Alle oben genannten Systeme ein Schema in irgendeiner Art von IDL definiert verwenden Code für eine Zielsprache zu erzeugen, die dann in die Codierung und Decodierung verwendet wird. Avro nicht. Avro typing ist dynamisch und seine Schemadaten zur Laufzeit direkt sowohl zu kodieren und dekodieren verwendet (was einige offensichtlich Kosten bei der Verarbeitung, aber auch einige offensichtlichen Vorteile gegenüber dynamische Sprachen und fehlende Notwendigkeit für Tagging-Typen, etc.) . Sein Schema verwendet JSON, die in einer neuen Sprache Avro Unterstützung einfacher etwas macht, um zu verwalten, wenn es bereits eine JSON-Bibliothek. Auch hier, wie bei den meisten Rad-neu zu erfinden Protokollbeschreibung Systemen wird Avro auch nicht standardisiert.

Persönlich trotz meiner Liebe / Hass-Beziehung mit ihm, würde ich wahrscheinlich verwenden ASN.1 für die meisten RPC und Nachrichtenübertragungszwecke, obwohl sie nicht wirklich einen RPC-Stack (man müßte man machen, aber IOCs machen, die einfach genug).

Andere Tipps

Wir haben nur eine interne Studie über Serializer, hier sind einige Ergebnisse (für meine zukünftige Referenz auch!)

Thrift = Serialisierung + RPC-Stack

Der größte Unterschied ist, dass Thrift nicht nur ein Serialisierung-Protokoll ist, dann ist es ein Blas- RPC-Stack, der wie ein moderner SOAP-Stack ist. So nach der Serialisierung, die Objekte könnte (aber nicht vorgeschrieben) zwischen Maschinen über TCP / IP gesendet werden. In SOAP, begann man mit einem WSDL-Dokument, das die verfügbaren Dienste (Remote-Methoden) und die erwarteten Argumente / Objekte vollständig beschreibt. Diese Objekte wurden über XML gesendet. In Thrift, beschreibt die .thrift Datei vollständig die zur Verfügung stehenden Methoden, erwartete Parameterobjekte und die Objekte werden über eine des verfügbaren Serializer (mit Compact Protocol, einem effizienten Binärprotokolls, wobei beliebteste in der Produktion) serialisiert werden.

ASN.1 = Grand Daddy

ASN.1 von Telekom-Leute in den 80er Jahren entwickelt wurde und ist umständlich aufgrund der begrenzten Bibliotheksunterstützung zu verwenden, wie auf den letzten Serializer verglichen, die aus CompSci Leute entstanden. Es gibt zwei Varianten, DER (binär) kodiert und PEM (ascii) Codierung. Beide sind schnell, aber DER ist schneller und Größe effizient der beiden. In der Tat kann ASN.1 DER halten leicht (und manchmal schlagen) Serializer, die entworfen wurden 30 Jahre nach sich, ein Beweis für es ausgereiftes Design. Es ist sehr kompakt, kleiner als Protocol Buffers und Thrift, nur durch Avro geschlagen. Das Problem wird mit großen Bibliotheken zu Unterstützung und jetzt scheint Bouncy Castle die beste für C # / Java zu sein. ASN.1 ist König in Sicherheit und Kryptosystemen und wird nicht weggehen, also nicht besorgt sein über ‚Zukunftssicherheit‘. Nehmen Sie einfach eine gute Bibliothek ...

Message = Mitte der Packung

Es ist nicht schlecht, aber es ist weder die schnellste, noch die kleinste noch die besten unterstützt. Kein Produktions Grund, sie zu wählen.

Allgemein

Darüber hinaus sind sie ziemlich ähnlich. Die meisten sind Varianten des Grund TLV: Type-Length-Value Prinzip.

Protocol Buffers (Google stammt), Avro (Apache basiert, verwendet in Hadoop), Thrift (Facebook entstanden, jetzt Apache-Projekt) und ASN.1 (Telecom entstanden) alle ein gewisses Maß an Codegenerierung voraus, in dem Sie zuerst Ihre Daten ausdrücken in einem Serializer spezifischen Format, dann wird der Serializer „Compiler“ wird Quellcode für Ihre Sprache über die code-gen Phase erzeugen. Ihre App Quelle verwendet dann diese code-gen Klassen für IO. Beachten Sie, dass bestimmte Implementierungen (zB: Microsofts Avro Bibliothek oder Marc Hammer des ProtoBuf.NET) können Sie Ihre App-Ebene POCO / POJO Objekte direkt dekorieren und verwendet dann die Bibliothek direkt jene eingerichteten Klassen statt irgendwelchen Code-gen der Klassen. Wir haben dieses Angebot eine Steigerung der Leistung zu sehen, da es eine Objektkopie Stufe eliminiert (aus Anwendungsebene POCO / POJO Felder Code-gen Felder).

Einige Ergebnisse und ein Live-Projekt spielt mit

Dieses Projekt ( https://github.com/sidshetye/SerializersCompare ) vergleicht wichtigen Serializer in dem C # Welt. Die Java-Leute haben bereits etwas ähnliches .

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!)

Das Hinzufügen der Leistungsperspektive, Uber kürzlich mehrere dieser Bibliotheken auf ihrem Engineering-Blog ausgewertet:

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

Der Gewinner für sie? Messagepack + zlib für die Komprimierung

Unser Ziel war es, die Kombination der Codierung Protokolls zu finden und Kompressionsalgorithmus mit dem kompakteste Ergebnis am höchsten Geschwindigkeit. Wir testeten kodiert Protokoll und Kompressionsalgorithmus Kombinationen auf 2219 Pseudo-Zufall anonymisierter Fahrten von Uber New York Stadt (put in einer Textdatei als JSON).

Die Lektion hier ist, dass Ihre Anforderungen treiben die Bibliothek ist das Richtige für Sie. Für Uber konnten sie nicht ein IDL-basiertes Protokoll aufgrund der schemaless Natur der Nachricht verwenden, vorbei sie haben. Dies beseitigt eine Reihe von Optionen. Auch für sie ist es nicht nur roh Codierung / Decodierung Zeit, die ins Spiel kommt, aber die Größe der Daten in Ruhe.

Größe Ergebnisse

 Größe Ergebnisse

Geschwindigkeits Ergebnisse

 image description hier

eingeben

Die eine große Sache über ASN.1 ist, ist, dass ist konzipiert für Beschreibung: nicht Umsetzung. Daher ist es sehr gut im Verstecken / Umsetzung Detail in jeder „echten“ Programmiersprache zu ignorieren.

Es ist die Aufgabe des ASN.1-Compiler zu Encoding Rules gelten für die asn1-Datei und erzeugen aus jedem von ihnen ausführbaren Code. Die Encoding Rules könnte in Codierung Notation (ECN) gegeben werden oder könnte einer der standardisierten diejenigen sein, wie BER / DER, PER, XER / Aufg. Das ist ASN.1 sind die Typen und Strukturen definiert die Encoding Rules die auf der Draht-Kodierung und nicht zuletzt die Compiler überträgt sie an Ihre Programmiersprache.

Die freien Compiler unterstützen C, C ++, C #, Java und Erlang meines Wissens. Die (viel zu teuer und Patent / Lizenzen geritten) kommerzielle Compiler sind sehr vielseitig, in der Regel absolut up-to-date und Unterstützung manchmal noch mehr Sprachen, sondern sehen ihre Websites (OSS Nokalva, Marben usw.).

Es ist überraschend einfach eine Schnittstelle zwischen den Parteien von völlig unterschiedlichen Programmier Kulturen angeben (zB „embedded“ Menschen und „Server Bauern“.) Unter Verwendung dieser Techniken: eine ASN.1-Datei, die Kodierung der Regel zum Beispiel BER und ein z.B. UML Interaktionsdiagramm. Keine Sorgen, wie sie umgesetzt wird, damit jeder Einsatz „ihr Ding“! Für mich hat es sehr gut funktioniert. Btw .: Bei OSS Nokalva Website Sie mindestens zwei Free-to-Download-Bücher über ASN.1 (ein von Larmouth der andere von Dubuisson) finden können.

IMHO die meisten anderen Produkte versuchen nur noch-ein anderes-RPC-Stub-Generatoren zu sein, viel Luft in die Serialisierung Problem zu pumpen. Nun, wenn man braucht, dass man könnte in Ordnung sein. Aber für mich, sie sehen aus wie Neuerfindungen von Sun-RPC (aus dem späten 80.), aber, hey, das gut funktioniert, auch.

Microsofts Bond ( https://github.com/Microsoft/bond ) ist sehr beeindruckend mit Leistung , Funktionalitäten und Dokumentation. Allerdings ist es nicht viele Zielplattformen ab sofort (13. Februar 2015) unterstützen. Ich kann nur annehmen, dass es ist, weil es sehr neu ist. Derzeit unterstützt es Python, C # und C ++. Sie wird von MS überall verwendet. Ich versuchte es, mir als ac # -Entwickler mit Bindung besser ist als protobuf verwenden, aber ich verwendet Sparsamkeit haben auch das einzige Problem, das ich konfrontiert mit der Dokumentation war, habe ich viele Dinge zu versuchen, hatte zu verstehen, wie die Dinge getan werden.

Nur wenig Ressourcen auf Bond sind wie folgt ( https://news.ycombinator.com/item? id = 8866694 , https://news.ycombinator.com/item?id=8866848 , https://microsoft.github.io/bond/why_bond.html)

Für Leistung, einen Datenpunkt ist jvm-Serializer Benchmark - es ist ganz spezifischer, kleine Nachrichten, aber könnte helfen, wenn Sie sind auf Java-Plattform. Ich denke, die Leistung in der Regel oft nicht der wichtigste Unterschied. Auch: Nehmen Sie NIEMALS Autoren Worte als Evangelium; viele beworbenen Ansprüche sind gefälschte (msgpack Website zum Beispiel hat einige zweifelhafte Ansprüche, es schnell sein kann, aber die Informationen sehr lückenhaft, Anwendungsfall nicht sehr realistisch).

Ein großer Unterschied ist, ob ein Schema verwendet werden muss (PB, Thrift zumindest, Avro es optional sein kann; ASN.1 Ich denke auch, MsgPack, die nicht unbedingt).

Auch: meiner Meinung nach ist es gut zu können, benutzen schichtete, modulares Design; das heißt, RPC-Ebene sollte nicht dictate Datenformat, Serialisierung. Leider diese die meisten Kandidaten haben eng bündeln.

Wenn schließlich Datenformat wählen, funktioniert heutzutage Leistung nicht aus, dass die Verwendung von Textformaten. Es gibt extrem schnellen JSON-Parser (und ziemlich schnell Streaming XML-Parser); und wenn die Interoperabilität von Skriptsprachen und Benutzerfreundlichkeit unter Berücksichtigung binäre Formate und Protokolle möglicherweise nicht die beste Wahl sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top