Quali sono le differenze principali tra Apache Thrift, Google protocollo Tamponi, MessagePack, ASN.1 e Apache Avro?

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

Domanda

Tutti questi forniscono serializzazione binaria, quadri RPC e IDL. Sono interessato a differenze principali tra di loro e le caratteristiche (prestazioni, facilità d'uso, la programmazione di supporto lingue).

Se conoscete altre tecnologie simili, la preghiamo di ricordare che in una risposta.

È stato utile?

Soluzione

ASN.1 è uno standard ISO / ISE. Ha una lingua di partenza molto leggibile e una varietà di back-end, sia binari e leggibile. Essendo uno standard internazionale (e uno vecchio a quello!) La lingua di origine è una cucina-sinkish bit (in circa allo stesso modo in cui l'Oceano Atlantico è un po 'bagnato) ma è estremamente ben specificato e ha discreta quantità di sostegno . (Si può probabilmente trovare una libreria ASN.1 per qualsiasi lingua è il nome se si scava abbastanza difficile, e se non ci sono buone biblioteche linguaggio C disponibili che è possibile utilizzare in FFI.) E ', essendo un linguaggio standardizzato, ossessivamente documentati e ha tutorial disponibili alcuni buoni pure.

Thrift non è uno standard. E 'originario di Facebook e fu poi open-source ed è attualmente un progetto Apache livello superiore. Non è ben documentato - i livelli di particolare Tutorial - e alla mia (certamente breve) occhiata non sembra aggiungere nulla che gli altri, gli sforzi precedenti non già lo fanno (e in alcuni casi meglio). Per essere onesti ad esso, ha un numero piuttosto impressionante di lingue supporta fuori dalla scatola tra cui alcune delle più alto profilo quelli non-mainstream. L'IDL è anche vagamente C-like.

buffer protocollo non è uno standard. Si tratta di un prodotto di Google che viene rilasciato alla comunità più ampia. E 'un po' limitato in termini di lingue supportate fuori dalla scatola (supporta solo C ++, Python e Java) ma ha un sacco di supporto di terze parti per altre lingue (di qualità molto variabile). Google fa praticamente tutto il loro lavoro utilizzando il protocollo Tamponi, quindi è un, agguerrito protocollo battaglia-testato (anche se non così agguerriti come ASN.1 è. Ha documentazione molto migliore di quanto non faccia Thrift, ma, essendo un prodotto di Google, è altamente probabile che sia instabile (nel senso di continua evoluzione, non nel senso di inaffidabile). l'IDL è anche C-like.

Tutti i sistemi di cui sopra utilizzano uno schema definito in una sorta di IDL per generare il codice per una lingua di destinazione che viene quindi utilizzato nella codifica e decodifica. Avro non lo fa. tipizzazione del Avro è dinamico e dei suoi dati schema viene utilizzato in fase di esecuzione direttamente sia per codificare e decodificare (che ha alcuni costi evidenti nella lavorazione, ma anche alcuni vantaggi evidenti Vis a Vis linguaggi dinamici e la mancanza di un bisogno per i tipi di codifica, etc.) . Il suo schema utilizza JSON che rende sostenere Avro in una nuova lingua un po 'più facile da gestire se c'è già una libreria JSON. Ancora una volta, come con la maggior parte dei sistemi di descrizione di protocollo ruota-riproponendo, Avro è anche non standardizzato.

Personalmente, nonostante il mio rapporto di amore / odio con esso, probabilmente sarei utilizzare ASN.1 per la maggior parte degli scopi RPC e trasmissione di messaggi, anche se in realtà non hanno uno stack RPC (che avrebbe dovuto fare uno, ma IOC fanno si che abbastanza semplice).

Altri suggerimenti

Abbiamo appena fatto uno studio interno su serializzatori, ecco alcuni risultati (per il mio riferimento futuro troppo!)

Thrift = serializzazione + RPC pila

La più grande differenza è che Thrift non è solo un protocollo di serializzazione, è una pila RPC pieno soffiato che è come un moderno pila giorno SOAP. Così, dopo la serializzazione, gli oggetti potrebbe (ma non mandato) essere inviati tra macchine su TCP / IP. In SOAP, si è iniziato con un documento WSDL che descrive appieno i servizi disponibili (metodi remoti) e le attese argomenti / oggetti. Questi oggetti sono stati inviati tramite XML. Nel Thrift, il file .thrift descrive appieno i metodi disponibili, oggetti parametri attesi e gli oggetti vengono serializzati tramite uno dei serializzatori disponibili (con Compact Protocol, un protocollo binario efficiente, essendo più in produzione).

ASN.1 = Grand Daddy

ASN.1 è stato progettato da gente di telecomunicazioni negli anni '80 ed è imbarazzante da usare grazie al supporto delle librerie limitato rispetto ai recenti serializzatori emerse da gente compsci. Ci sono due varianti, DER (binario) codifica e la codifica PEM (ASCII). Entrambi sono veloci, ma DER è più veloce e più efficiente dimensioni dei due. Infatti ASN.1 DER può facilmente tenere il passo (e talvolta battere) serializzatori che sono stati progettati 30 anni di progettazione dopo sé, un testamento di è ben progettato. E 'molto compatto, più piccolo di protocollo Tamponi e la parsimonia, solo battuto da Avro. La questione sta avendo grandi biblioteche a supporto e in questo momento Bouncy Castle sembra essere la migliore per C # / Java. ASN.1 è re nei sistemi di sicurezza e di crittografia e non ha intenzione di andare via, quindi non essere preoccupato 'futuro proofing'. Basta avere una biblioteca buona ...

MessagePack = mezzo al gruppo

Non è male, ma non è né il più veloce, né il più piccolo, né il migliore supportato. Non c'è ragione di produzione per sceglierlo.

Comune

Oltre a questo, sono abbastanza simili. La maggior parte sono varianti del principio di TLV: Type-Length-Value base.

buffer protocollo (Google ha avuto origine), Avro (basato su Apache, utilizzato in Hadoop), Thrift (Facebook origine, ora Apache del progetto) e ASN.1 (Telecom ha avuto origine) tutto comporta un certo livello di generazione di codice in cui esprimete i vostri dati prima in un formato serializzatore-specifica, poi il serializzatore "compilatore" genererà il codice sorgente per la lingua tramite la fase code-gen. La vostra fonte applicazione utilizza poi queste classi code-gen per IO. Si noti che alcune implementazioni (ad esempio: libreria Avro di Microsoft o di Marc Martelletto del ProtoBuf.NET) consentono di decorare direttamente il vostro POCO livello di app / oggetti POJO e poi la libreria utilizza direttamente le classi decorate invece di tutte le classi code-gen di. Abbiamo visto questa offerta una performance spinta in quanto elimina una fase di copia oggetto (dal livello di applicazione campi POCO / POJO ai campi codice-Gen).

Alcuni risultati e un progetto live di giocare con

Questo progetto ( https://github.com/sidshetye/SerializersCompare ) confronta serializzatori importanti della C # mondo. La gente Java già qualcosa di simile .

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

In aggiunta alla vista delle prestazioni, Uber recentemente valutato molte di queste librerie sul loro blog di ingegneria:

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

Il vincitore per loro? MessagePack + zlib per la compressione

  

Il nostro obiettivo era quello di trovare la combinazione di protocollo di codifica e   algoritmo di compressione con il risultato più compatto al più alto   velocità. Abbiamo testato codificante algoritmo di protocollo e la compressione   combinazioni su 2.219 pseudocasuali anonima viaggi da Uber New York   Città (mettere in un file di testo come JSON).

La lezione è che le vostre esigenze di auto quale libreria è giusto per te. Per Uber non potevano utilizzare un protocollo basato IDL a causa della natura schemaless di message passing che hanno. Questo ha eliminato una serie di opzioni. Anche per loro è non solo la codifica grezza / ora che entra in gioco, ma la dimensione dei dati a riposo decodifica.

Dimensione Risultati

 Dimensione Risultati

Velocità Risultati

 entrare descrizione dell'immagine qui

L'unica cosa grande circa ASN.1 è, che l'IST è stato progettato per specifica non implementazione. Perciò è molto bravo a nascondere / ignorando dettaglio implementativo in qualsiasi "vero" linguaggio di programmazione.

Il suo compito del ASN.1-compilatore di applicare le regole di codifica per l'ASN1 file e generare da entrambi codice eseguibile. Le regole di codifica potrebbe essere riportata in codifica Notation (ECN) o potrebbe essere uno di quelli standard, come BER / DER, PER, XER / EXER. Cioè ASN.1 è i tipi e le strutture, le regole di codifica definiscono la codifica sul filo, e, ultimo ma non meno importante il trasferimento del compilatore per il linguaggio di programmazione.

I compilatori supportano liberi C, C ++, C #, Java, e Erlang a mia conoscenza. Il (molto costoso e brevetti / licenze cavalcati) compilatori commerciali sono molto versatili, di solito assolutamente up-to-date e il supporto a volte anche più lingue, ma vedono i loro siti (OSS Nokalva, MARBEN ecc.).

E 'sorprendentemente facile da specificare un'interfaccia tra le parti di totalmente diverse culture di programmazione (ad esempio, "embedded" e "persone agricoltori server".) Utilizzando questa tecnica: un file ASN.1, la regola di codifica per esempio BER e un esempio UML Interaction Diagram. No Worries come viene implementato, lasciare che l'uso tutti "cosa loro"! Per me ha funzionato molto bene. Btw .: Il sito di Al OSS Nokalva si può trovare almeno due libri free-to-download su ASN.1 (uno per Larmouth l'altra da Dubuisson).

IMHO la maggior parte degli altri prodotti solo cercare di essere ancora-un altro-RPC-stub-generatori, pompando un sacco di aria la questione serializzazione. Beh, se uno ha bisogno che, si potrebbe andare bene. Ma a me, sembrano reinvenzioni di Sun-RPC (dalla fine del 80 °), ma, ehi, che ha funzionato bene, anche.

di Microsoft Bond ( https://github.com/Microsoft/bond ) è molto impressionante, con prestazioni , le funzionalità e la documentazione. Tuttavia non supporta molte piattaforme di destinazione fin d'ora (13 febbraio 2015). Posso solo supporre che è perché è molto nuovo. Attualmente supporta Python, C # e C ++. E 'utilizzato da MS in tutto il mondo. Ho provato, a me come ac # sviluppatore che utilizza legame è meglio che usare protobuf, la parsimonia però ho usato come bene, l'unico problema che ho affrontato ero con la documentazione, ho dovuto provare molte cose per capire come vanno le cose.

Poche risorse sul prestito sono le seguenti ( https://news.ycombinator.com/item? id = 8866694 , https://news.ycombinator.com/item?id=8866848 , https://microsoft.github.io/bond/why_bond.html)

Per le prestazioni, un punto di riferimento dei dati è JVM-serializzatori - è abbastanza specifica, piccoli messaggi, ma potrebbe aiutare se siete su piattaforma Java. Credo che le prestazioni in volontà generale, spesso non sia la differenza più importante. Inoltre: Mai prendere le parole degli autori come vangelo; molte affermazioni pubblicizzati sono falsi (sito msgpack per esempio ha alcune affermazioni dubbie, che può essere veloce, ma le informazioni è molto impreciso, caso d'uso non molto realistico).

Una grande differenza è se uno schema deve essere utilizzato (PB, Thrift almeno; Avro può essere facoltativo; ASN.1 penso anche, MsgPack, non necessariamente).

Inoltre: a mio parere è bene essere in grado di utilizzare più livelli, design modulare; cioè, livello RPC dovrebbe formato di dati non dettare, la serializzazione. Purtroppo la maggior parte dei candidati non strettamente raggruppare questi.

Infine, al momento di scegliere il formato dei dati, al giorno d'oggi le prestazioni non fa uso ostino di formati testuali. Ci sono fiammeggianti parser JSON veloci (e piuttosto veloce in streaming parser XML); e se si considera l'interoperabilità da linguaggi di scripting e la facilità d'uso, formati e protocolli binari potrebbero non essere la scelta migliore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top