Maiores diferenças de Thrift vs Buffers de Protocolo?

286

Quais são os maiores prós e contras do Apache Thrift versus os buffers de protocolo do Google ?

Jonas
fonte
4
Como uma nota lateral, Marc Gravell mantém uma biblioteca para trabalhar com Googles protobuf chamado protobuf.net e é a code.google.com/p/protobuf-net
RCIX
5
Esta pergunta e algumas das respostas a seguir têm aproximadamente 6 anos. Provavelmente muita coisa mudou desde então.
AlikElzin-Kilaka

Respostas:

159

Ambos oferecem muitos dos mesmos recursos; No entanto, existem algumas diferenças:

  • O Thrift suporta 'exceções'
  • Buffers de protocolo têm documentação / exemplos muito melhores
  • O Thrift possui um Settipo embutido
  • Os buffers de protocolo permitem "extensões" - você pode estender um proto externo para adicionar campos extras, enquanto ainda permite que o código externo opere nos valores. Não há como fazer isso no Thrift
  • Acho Buffers de Protocolo muito mais fáceis de ler

Basicamente, eles são bastante equivalentes (com os Buffers de Protocolo um pouco mais eficientes do que eu li).

hazzen
fonte
16
Esta apresentação explica-lhes bem a partir de 2013 slideshare.net/IgorAnishchenko/pb-vs-thrift-vs-avro
BAR
13
suportes brechós como mais 10 idiomas
Elias Saounkine
1
Para alguns idiomas, você pode adicionar extensões. Por exemplo, o Thrift gera classes parciais para C # que são fáceis de estender. No entanto, essa não é a regra geral, é verdade.
precisa saber é
grpc 1,0 (proto3) apoio maptambém
KindDragon
85

Outra diferença importante são os idiomas suportados por padrão.

  • Buffers de protocolo: Java, Java Android, C ++, Python, Ruby, C #, Go, Objective-C, Node.js
  • Thrift: Java, C ++, Python, Ruby, C #, Go, Objective-C, JavaScript, Node.js, Erlang, PHP, Perl, Haskell, Smalltalk, OCaml, Delphi, D, Haxe

Ambos podem ser estendidos para outras plataformas, mas essas são as ligações de idiomas disponíveis prontas para uso.

Mike Gray
fonte
16
O protobuf possui excelente suporte a ruby, github.com/macks/ruby-protobuf e code.google.com/p/ruby-protobuf . Estou usando o protobuf do C # (3.5) e Ruby, serializando os dados em C # e, quando necessário, Ruby desserializando e trabalhando na tarefa.
Bryan Bailliache 24/02
6
O code.google.com/p/protobuf/wiki/ThirdPartyAddOns lista PHP, Ruby, Erlang, Perl, Haskell, C #, OCaml e Actiona Script, Common Lisp, Go, Lua, Mathlab, Visual Basic, Scala. Pensei que fossem todas implementações de terceiros.
Igor Gatis
você poderia usar diretamente protobuf C ++ arquivos no c objetiva (tanto para iOS e OS X) verificar isso qn
Tushar Koul
Vejo que code.google.com/p/protobuf-net é frequentemente mencionado como uma porta protobuf para C #, mas não é completamente verdade. Uma das características importantes do Protobuf e do Thrift é a definição de estrutura externa; portanto, a mesma definição pode ser usada por diferentes idiomas. O protobuf-net não suporta esse recurso porque incorpora a definição da estrutura dentro do código C #.
Andriy Tylychko
@ AndyT: Isso é discutível - depende se é uma vantagem que a definição da estrutura seja EXTERNA para todos os idiomas que você deseja suportar. Com o protobuf-net, você define sua estrutura de dados em C # e gera o arquivo .proto a partir dele, que pode ser usado para criar o suporte nos outros idiomas. Considero que isso é uma vantagem, pois sou muito cêntrico em C # e estou no processo de integração do Android / Java com um grande aplicativo .Net existente. Então, eu quero continuar a considerar minhas classes C # como as definições definitivas da estrutura.
RenniePet
73

RPC é outra diferença importante. A Thrift gera código para implementar clientes e servidores RPC, nos quais os Buffers de Protocolo parecem projetados principalmente apenas como um formato de intercâmbio de dados.

saidimu apale
fonte
9
Isso não é verdade. Os buffers de protocolo definem uma API de serviço RPC e existem algumas bibliotecas disponíveis para implementar a passagem de mensagens.
Stephen
7
Eu não disse que o Protobuf não possui RPC definido, apenas que ele não parece ter sido projetado para isso, pelo menos não a versão externa a que todos têm acesso. Leia o comentário deste engenheiro do Google aqui
saidimu apale
9
Mais importante, o Thrift possui suporte a RPC embutido. Atualmente, o Protobuf conta com bibliotecas de terceiros, o que significa menos olhos, menos testes e códigos menos confiáveis.
Alec Thomas
2
Para mim, é um bom argumento sobre o ProtoBuf. Se você precisar serializar apenas, não adicione código inútil. E se, no futuro, você precisar enviá-lo por RPC, não há problema, ele pode funcionar. Eu uso o Netty para a rede e o Protobuf é perfeitamente integrado, então não há problema, não há teste e maximizo o desempenho.
Kikiwa #
14
Os protobufs foram projetados com o RPC em mente. Google apenas open-source que o componente bastante recentemente - grpc.io
andybons
57
  • Os objetos serializados do Protobuf são cerca de 30% menores que o Thrift.
  • A maioria das ações que você pode querer executar com objetos protobuf (criar, serializar, desserializar) é muito mais lenta que a economia, a menos que você ative option optimize_for = SPEED.
  • O Thrift possui estruturas de dados mais ricas (Mapa, Conjunto)
  • A API do Protobuf parece mais limpa, embora as classes geradas sejam todas compactadas como classes internas, o que não é tão bom.
  • As enums de parcimônia não são Java Enums reais, ou seja, são apenas ints. Protobuf possui enums reais de Java.

Para uma análise mais detalhada das diferenças, verifique as diferenças de código-fonte neste projeto de código-fonte aberto .

eishay
fonte
1
Sugestão rápida: seria interessante se houvesse outro formato não binário (xml ou json?) Usado como linha de base. Não houve bons testes que mostrem tendências gerais - supondo-se que PB e Thrift sejam mais eficientes, mas se e por quanto, é uma questão em aberto.
StaxMan
4
0,02 segundos ?! Eu não tenho esse tipo de tempo livre
Chris S
1
Agora que o Thrift possui vários protocolos (incluindo um TCompactProtocol), acho que o primeiro marcador não se aplica mais.
Janus Troelsen
13
A opção Optimizar para velocidade é agora o padrão para buffers de protocolo ( code.google.com/apis/protocolbuffers/docs/proto.html )
Willem
5
Obtemos objetos 30% menores com o conjunto "optimize_for = speed"? Ou isso está comprometido?
Prashant Sharma
56

Como eu disse como tópico "Thrift vs Protocol buffers" :

Referindo-se à comparação Thrift vs Protobuf vs JSON :

Além disso, existem muitas ferramentas adicionais interessantes disponíveis para essas soluções, que podem ser decididas. Aqui estão alguns exemplos do Protobuf: Protobuf-wireshark , protobufeditor .

Grzegorz Wierzowiecki
fonte
10
Agora este é um círculo completo. Você postou a mesma resposta exata para três perguntas (semelhantes) sempre vinculadas a uma ou outra. Eu sinto que estou jogando Zelda e perdi um sinal.
ChrisR
+ ChrisR heh, não me lembro como isso aconteceu. Embora houvesse algumas perguntas semelhantes, talvez eu devesse fazer três estruturas iguais em vez de ciclo. Um dia ... É uma pergunta muito antiga e agora estou respondendo por telefone. De qualquer forma, obrigado pela captura!
Grzegorz Wierzowiecki 12/01
6
"Thrift vem com um bom tutorial" - que engraçado. É o tutorial mais incompleto que eu já vi. Assim que você quer fazer algo ao lado TSimpleServer você ficar preso lá
Marian Klühspies
Thrift também tem Wireshark plugin: github.com/andrewcox/wireshark-with-thrift-plugin
CCoder
8

Os buffers de protocolo parecem ter uma representação mais compacta, mas isso é apenas uma impressão que tenho ao ler o whitepaper Thrift. Em suas próprias palavras:

Decidimos contra algumas otimizações extremas de armazenamento (por exemplo, compactar números inteiros pequenos em ASCII ou usar um formato de continuação de 7 bits) por uma questão de simplicidade e clareza no código. Essas alterações podem ser facilmente feitas se e quando encontrarmos um caso de uso crítico de desempenho que as exija.

Além disso, pode ser apenas a minha impressão, mas os Protocol Buffers parecem ter algumas abstrações mais espessas em torno da versão struct. O Thrift tem algum suporte à versão, mas é preciso um pouco de esforço para que isso aconteça.

Daniel Spiewak
fonte
1
Por que o fato de a Thrift admitir não ser o mais compacto possível leva você a acreditar que os Buffers de Protocolo são?
Michael Mior 14/10
1
Os buffers de protocolo usam codificação inteira de comprimento variável, tanto para valores quanto para identificadores de campo. Portanto, o caso muito comum de enviar um campo int com um valor pequeno será de dois bytes, não int16 e int32.
Pool #
"Buffers de protocolo usam codificação inteira de comprimento variável" - assim como TCompactProtocol
JensG
8

Consegui obter um melhor desempenho com um protocolo baseado em texto em comparação com o protobuff no python. No entanto, nenhuma verificação de tipo ou outra conversão utf8 sofisticada, etc ..., que o protobuff oferece.

Portanto, se você precisar de serialização / desserialização, provavelmente poderá usar outra coisa.

http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html

dhruvbird
fonte
7

Uma coisa óbvia ainda não mencionada é que pode ser um pró ou um contra (e é o mesmo para ambos) é que eles são protocolos binários. Isso permite uma representação mais compacta e possivelmente mais desempenho (profissionais), mas com legibilidade reduzida (ou melhor, depuração), um golpe.

Além disso, ambos têm pouco menos suporte a ferramentas do que os formatos padrão como xml (e talvez até json).

(EDIT) Aqui está uma comparação interessante que aborda as diferenças de tamanho e desempenho e inclui números para alguns outros formatos (xml, json) também.

StaxMan
fonte
3
É trivial gerar um buffer de protocolo para uma representação de texto muito mais legível por humanos que XML: my_proto.DebugString (). Por exemplo, consulte code.google.com/apis/protocolbuffers/docs/overview.html
SuperElectric
Obviamente, o mesmo vale para todos os formatos binários - mas isso não os torna legíveis como estão (depuração on the wire). Pior, para o protobuf, você realmente precisa da definição do esquema para saber os nomes dos campos.
StaxMan
O Thrift suporta protocolos diferentes, mesmo definidos pelo usuário. Você pode usar binário, compacto, json ou algo que você inventou apenas na semana passada.
JensG
6

E, de acordo com o wiki, o tempo de execução do Thrift não é executado no Windows.


fonte
5
Eu corro Thrift no Windows com sucesso. Use o fork do windows em github.com/aubonbeurre/thrift
Sergey Podobry
20
A ramificação oficial da linha principal agora também oferece suporte ao Windows.
Janus Troelsen
5
@dalle - Alex P adicionou o suporte ao segmento Boost no Thrift. Agora é o segmento padrão para Windows. * NIX assume como padrão pthreads. E para confirmar o Janus T, o Thrift agora suporta totalmente o Windows.
pmont
21
Esta é uma informação desatualizada. O Thrift funciona perfeitamente no Windows há um longo tempo.
precisa saber é
6

ProtocolBuffers é mais rápido.
Há uma boa referência aqui:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

Você também pode procurar no Avro, pois o Avro é ainda mais rápido.
A Microsoft possui um pacote aqui:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro

A propósito, o mais rápido que eu já vi é o Cap'nProto ;
A implementação do AC # pode ser encontrada no repositório do Github de Marc Gravell .

Stefan Steiger
fonte
4

Acho que a maioria desses pontos perdeu o fato básico de que o Thrift é uma estrutura RPC, que tem a capacidade de serializar dados usando uma variedade de métodos (binário, XML, etc.).

Os buffers de protocolo são projetados exclusivamente para serialização, não é uma estrutura como a Thrift.

Babra Cunningham
fonte
3
O que você quer dizer com estrutura RPC e como isso é diferente do gRPC do protobuf ?
Marcelocra
O gRPC não é empacotado junto com o protobuf. Foi desenvolvido 10 anos depois. O Thrift é fornecido com a estrutura RPC completa. Foi feito juntos.
trilogia
3

Por um lado, protobuf não é uma implementação completa de RPC. Requer algo como o gRPC para acompanhá-lo.

O gPRC é muito lento comparado ao Thrift:

http://szelei.me/rpc-benchmark-part1/

trilogia
fonte
0

Existem alguns pontos excelentes aqui e vou adicionar outro caso o caminho de alguém cruze aqui.

O Thrift oferece a opção de escolher entre o serializador thrift-binário e thrift-compact (des), o thrift-binary terá um desempenho excelente, mas um tamanho de pacote maior, enquanto o thrift-compact oferecerá uma boa compactação, mas precisará de mais poder de processamento. Isso é útil porque você sempre pode alternar entre esses dois modos tão facilmente quanto alterar uma linha de código (diabos, até torná-la configurável). Portanto, se você não tiver certeza de quanto o seu aplicativo deve ser otimizado para o tamanho do pacote ou o poder de processamento, a economia pode ser uma opção interessante.

PS: Veja este excelente projeto de benchmark pelo thekvsqual compara muitos serializadores, incluindo thrift-binário, thrift-compact e protobuf: https://github.com/thekvs/cpp-serializers

PS: Há outro serializador nomeado YASque também oferece essa opção, mas sem esquema, veja o link acima.

Sinapse
fonte
0

Também é importante observar que nem todos os idiomas suportados são compatíveis com parcimônia ou protobuf. Neste ponto, é uma questão de implementação dos módulos, além da serialização subjacente. Tome cuidado para verificar as referências de qualquer idioma que você planeja usar.

JSON
fonte