Quais são os maiores prós e contras do Apache Thrift versus os buffers de protocolo do Google ?
Quais são os maiores prós e contras do Apache Thrift versus os buffers de protocolo do Google ?
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).
map
também
Outra 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.
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.
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 .
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 .
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.
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
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.
E, de acordo com o wiki, o tempo de execução do Thrift não é executado no Windows.
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 .
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.
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:
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-serializers
PS: Há outro serializador nomeado YAS
que também oferece essa opção, mas sem esquema, veja o link acima.