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).
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
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.
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.
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.
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 .
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á
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.
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.
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.
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.
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.
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.
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.
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.
Respostas:
Ambos oferecem muitos dos mesmos recursos; No entanto, existem algumas diferenças:
Set
tipo embutidoBasicamente, eles são bastante equivalentes (com os Buffers de Protocolo um pouco mais eficientes do que eu li).
fonte
map
tambémOutra diferença importante são os idiomas suportados por padrão.
Ambos podem ser estendidos para outras plataformas, mas essas são as ligações de idiomas disponíveis prontas para uso.
fonte
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.
fonte
option optimize_for = SPEED
.Para uma análise mais detalhada das diferenças, verifique as diferenças de código-fonte neste projeto de código-fonte aberto .
fonte
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 .
fonte
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:
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.
fonte
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
fonte
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.
fonte
E, de acordo com o wiki, o tempo de execução do Thrift não é executado no Windows.
fonte
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 .
fonte
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.
fonte
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/
fonte
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
thekvs
qual compara muitos serializadores, incluindo thrift-binário, thrift-compact e protobuf: https://github.com/thekvs/cpp-serializersPS: Há outro serializador nomeado
YAS
que também oferece essa opção, mas sem esquema, veja o link acima.fonte
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.
fonte