Quali sono i maggiori pro e contro di Apache Thrift vs Buffer di protocollo di Google ?
Quali sono i maggiori pro e contro di Apache Thrift vs Buffer di protocollo di Google ?
Risposte:
Entrambi offrono molte delle stesse funzionalità; tuttavia, ci sono alcune differenze:
Set
tipo incorporatoFondamentalmente, sono abbastanza equivalenti (con Protocol Buffers leggermente più efficiente da quello che ho letto).
map
anche
Un'altra differenza importante sono le lingue supportate per impostazione predefinita.
Entrambi potrebbero essere estesi ad altre piattaforme, ma questi sono i binding di lingue disponibili immediatamente.
RPC è un'altra differenza fondamentale. Thrift genera codice per implementare client e server RPC laddove i buffer di protocollo sembrano principalmente progettati come un solo formato di scambio dati.
option optimize_for = SPEED
.Per uno sguardo più attento alle differenze, controlla le differenze del codice sorgente in questo progetto open source .
Come ho detto come argomento "Buffer di parsimonia contro protocollo" :
Facendo riferimento al confronto Thrift vs Protobuf vs JSON :
Inoltre, ci sono molti strumenti aggiuntivi interessanti disponibili per quelle soluzioni, che potrebbero decidere. Ecco alcuni esempi di Protobuf: Protobuf- WireShark , Protobufeditor .
Protocol Buffers sembra avere una rappresentazione più compatta, ma questa è solo un'impressione che ottengo leggendo il white paper di Thrift. Con le loro stesse parole:
Abbiamo deciso di evitare alcune ottimizzazioni di archiviazione estreme (ovvero l'imballaggio di piccoli numeri interi in ASCII o l'utilizzo di un formato di continuazione a 7 bit) per motivi di semplicità e chiarezza nel codice. Queste modifiche possono essere facilmente apportate se e quando incontriamo un caso d'uso critico per le prestazioni che li richiede.
Inoltre, potrebbe essere solo la mia impressione, ma Protocol Buffers sembra avere alcune astrazioni più spesse riguardo il versioning di struct. Thrift ha un po 'di supporto per il controllo delle versioni, ma ci vuole un po' di sforzo per realizzarlo.
Sono stato in grado di ottenere prestazioni migliori con un protocollo testuale rispetto a protobuff su Python. Tuttavia, nessun controllo del tipo o altra conversione utf8 di fantasia, ecc ... che offre protobuff.
Quindi, se la serializzazione / deserializzazione è tutto ciò di cui hai bisogno, allora probabilmente puoi usare qualcos'altro.
http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html
Una cosa ovvia non ancora menzionata è che possono essere sia pro che contro (ed è uguale per entrambi) è che sono protocolli binari. Ciò consente una rappresentazione più compatta e possibilmente più prestazioni (pro), ma con una leggibilità ridotta (o meglio, debuggabilità), un contro.
Inoltre, entrambi hanno un supporto degli strumenti leggermente inferiore rispetto ai formati standard come xml (e forse anche json).
(EDIT) Ecco un confronto interessante che affronta sia le dimensioni che le differenze di prestazioni e include numeri anche per alcuni altri formati (xml, json).
E secondo la wiki il runtime di Thrift non funziona su Windows.
ProtocolBuffers è più veloce.
C'è un bel benchmark qui:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
Potresti anche voler esaminare Avro, poiché Avro è ancora più veloce.
Microsoft ha un pacchetto qui:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro
A proposito, il più veloce che abbia mai visto è Cap'nProto ;
L'implementazione di AC # è disponibile nel repository Github di Marc Gravell .
Penso che la maggior parte di questi punti abbia perso il fatto fondamentale che Thrift è un framework RPC, che ha la capacità di serializzare i dati utilizzando una varietà di metodi (binario, XML, ecc.).
I buffer di protocollo sono progettati esclusivamente per la serializzazione, non è un framework come Thrift.
Per uno, protobuf non è un'implementazione RPC completa. Richiede qualcosa come gRPC per andare con esso.
gPRC è molto lento rispetto a parsimonia:
Ci sono alcuni punti eccellenti qui e ne aggiungerò un altro nel caso in cui il percorso di qualcuno attraversi qui.
Thrift ti dà la possibilità di scegliere tra serializzatore binario-parsimonioso e compatto (de) parsimonioso, binario-parsimonioso avrà prestazioni eccellenti ma dimensioni del pacchetto maggiori, mentre compatto-parsimonioso ti darà una buona compressione ma ha bisogno di più potenza di elaborazione. Questo è utile perché puoi sempre passare tra queste due modalità con la stessa facilità con cui si modifica una riga di codice (diamine, anche renderlo configurabile). Quindi, se non sei sicuro di quanto la tua applicazione debba essere ottimizzata per la dimensione del pacchetto o in termini di potenza di elaborazione, la parsimonia può essere una scelta interessante.
PS: vedi questo eccellente progetto di benchmark con thekvs
cui confronta molti serializzatori tra cui binario di risparmio, compasso di risparmio e protobuf: https://github.com/thekvs/cpp-serializers
PS: Esiste un altro serializzatore YAS
che dà anche questa opzione, ma è senza schema vedere il link sopra.
È anche importante notare che non tutte le lingue supportate si confrontano in modo coerente con la parsimonia o il protobuf. A questo punto si tratta dell'implementazione dei moduli oltre alla serializzazione sottostante. Assicurati di controllare i benchmark per qualsiasi lingua tu preveda di utilizzare.