it-swarm-pt.tech

Maiores diferenças de Thrift vs Protocol Buffers?

Quais são os maiores prós e contras do Apache Thrift vs Buffers de Protocolo do Google ?

256
Bob

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

  • Thrift suporta "exceções"
  • Protocol Buffers tem documentação/exemplos muito melhores
  • O Thrift tem um tipo Set incorporado
  • 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 Protocol Buffers muito mais fácil de ler

Basicamente, eles são bastante equivalentes (com Protocol Buffers ligeiramente mais eficientes do que eu li).

145
hazzen

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 estas são as ligações de idiomas prontas para uso.

78
Mike Gray

RPC é outra diferença fundamental. O Thrift gera código para implementar clientes e servidores RPC, nos quais os Protocol Buffers parecem, em sua maioria, projetados apenas como formato de intercâmbio de dados.

68
saidimu apale
  • Os objetos serializados Protobuf são cerca de 30% menores que o Thrift.
  • A maioria das ações que você pode querer fazer com objetos protobuf (criar, serializar, desserializar) são muito mais lentas do que parcimônia a menos que você ative option optimize_for = SPEED
  • O Thrift tem estruturas de dados mais avançadas (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.
  • Os enums do Thrift não são Enums Java reais, ou seja, são apenas ints. Protobuf tem enums Java reais.

Para um olhar mais atento sobre as diferenças, confira o código fonte diffs em este projeto de código aberto .

56
eishay

Como eu disse como "Thrift vs Protocol buffers" topic:

Referindo-se a Comparação Thrift vs Protobuf vs JSON :

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

54
Grzegorz Wierzowiecki

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

Então, se serialização/desserialização é tudo que você precisa, então provavelmente você pode usar outra coisa.

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

8
dhruvbird

Uma coisa óbvia ainda não mencionada é que pode ser tanto um pro como um con (e é o mesmo para ambos) é que eles são protocolos binários. Isso permite uma representação mais compacta e possivelmente mais desempenho (pros), mas com legibilidade reduzida (ou melhor, debuggability), um con.

Além disso, ambos têm 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 diferenças de tamanho e desempenho, e inclui números para alguns outros formatos (xml, json) também.

7
StaxMan

O protocolo Buffers parece ter uma representação mais compacta, mas essa é apenas uma impressão que tenho ao ler o whitepaper da Thrift. Em suas próprias palavras:

Decidimos contra algumas otimizações extremas de armazenamento (isto é, compactação de Inteiros pequenos em ASCII ou usando um formato de continuação de 7 bits) Para simplificar e esclarecer o código. Essas alterações Podem ser feitas facilmente se e quando encontrarmos um caso de uso de desempenho crítico Que as exija.

Além disso, pode ser apenas minha impressão, mas o Protocol Buffers parece ter algumas abstrações mais espessas em torno do versionamento de estruturas. O Thrift tem algum suporte a versões, mas é necessário um pouco de esforço para que isso aconteça.

7
Daniel Spiewak

ProtocolBuffers é mais rápido.
Existe um benchmark de Nice aqui:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

Você também pode querer olhar para Avro, como Avro é ainda mais rápido.
A Microsoft tem um pacote aqui:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro ​​

By the way, o mais rápido que eu já vi é Cap'nProto ;
Uma implementação em C # pode ser encontrada no Github-repository de Marc Gravell .

6
Stefan Steiger

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

6
hplbsh

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

Buffers de protocolo são projetados puramente para serialização, não é um framework como Thrift. 

3
Babra Cunningham

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

o gPRC é muito lento em comparação com o Thrift:

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

2
trilogy

Também é importante notar que nem todos os idiomas suportados são consistentemente compatíveis com thrift ou protobuf. Neste ponto, é uma questão da implementação dos módulos, além da serialização subjacente. Tome cuidado para verificar os benchmarks para qualquer idioma que você planeja usar.

0
JSON

Há alguns pontos excelentes aqui e vou adicionar outro caso o caminho de alguém passe por aqui.

Thrift dá-lhe a opção de escolher entre thrift-binary e thrift-compact (de) serializer, thrift-binary terá um excelente desempenho, mas maior tamanho de pacote, enquanto thrift-compact lhe dará boa compressão, mas precisa de mais poder de processamento. Isso é útil porque você sempre pode alternar entre esses dois modos tão facilmente quanto mudar uma linha de código (até mesmo torná-lo configurável). Portanto, se você não tiver certeza de quanto seu aplicativo deve ser otimizado para o tamanho do pacote ou para o poder de processamento, a economia pode ser uma opção interessante.

PS: Veja este excelente projeto de benchmark por thekvs que compara muitos serializadores incluindo thrift-binary, thrift-compact e protobuf: https://github.com/thekvs/cpp-serializers

PS: Existe outro serializador chamado YAS que também dá essa opção, mas é sem esquema, veja o link acima.

0
Sinapse