it-swarm-ru.tech

Самые большие различия между Thrift и Protocol Buffers?

Каковы основные плюсы и минусы Apache Thrift vs Буферы протокола Google ?

256
Bob

Они оба предлагают много одинаковых функций; Однако есть некоторые различия:

  • Thrift поддерживает «исключения»
  • Протоколные буферы имеют намного лучшую документацию/примеры
  • Thrift имеет встроенный тип Set
  • Буферы протокола допускают «расширения» - вы можете расширять внешний протокол для добавления дополнительных полей, в то же время позволяя внешнему коду работать со значениями. В Thrift нет способа сделать это
  • Я считаю, что протокол буфера гораздо проще читать

По сути, они довольно эквивалентны (с тем, что буфер протоколов немного более эффективен из того, что я прочитал).

145
hazzen

Еще одним важным отличием являются языки, поддерживаемые по умолчанию.

  • Буферы протокола: Java, Android Java, C++, Python, Ruby, C #, Go, Objective-C, Node.js
  • Экономия: Java, C++, Python, Ruby, C #, Go, Objective-C, JavaScript, Node.js, Erlang, PHP, Perl, Haskell, Smalltalk, OCaml, Delphi, D, Haxe

Оба могут быть расширены для других платформ, но это привязки к языкам, доступные из коробки.

78
Mike Gray

RPC - еще одно ключевое отличие. Thrift генерирует код для реализации клиентов и серверов RPC, где буферные протоколы, по-видимому, в основном предназначены только для обмена данными.

68
saidimu apale
  • Сериализированные объекты Protobuf примерно на 30% меньше, чем Thrift.
  • Большинство действий, которые вы можете выполнять с объектами protobuf (создание, сериализация, десериализация), выполняются намного медленнее, чем thrift , если вы не включите option optimize_for = SPEED
  • Thrift имеет более богатые структуры данных (Карта, Набор)
  • API Protobuf выглядит чище, хотя сгенерированные классы упакованы как внутренние классы, что не так приятно.
  • Экономичные перечисления не являются настоящими перечислениями Java, то есть они просто целочисленные. Protobuf имеет настоящие Java-перечисления.

Для более детального ознакомления с различиями посмотрите исходные коды diff в этот проект с открытым исходным кодом .

56
eishay

Как я уже сказал, как "Thrift против протокольных буферов" topic:

Ссылаясь на Сравнение Thrift и Protobuf с JSON :

Кроме того, есть множество интересных дополнительных инструментов, доступных для этих решений, которые могут решить. Вот примеры для Protobuf: Protobuf-wireshark , protobufeditor .

54
Grzegorz Wierzowiecki

Я смог добиться лучшей производительности с текстовым протоколом по сравнению с protobuff на python. Тем не менее, нет проверки типов или другого необычного преобразования utf8 и т. Д ..., которые предлагает protobuff.

Итак, если вам нужна сериализация/десериализация, то вы можете использовать что-то еще.

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

8
dhruvbird

Одна очевидная вещь, еще не упомянутая, заключается в том, что они могут быть как за, так и против (и одинаковы для обоих), это то, что они являются двоичными протоколами. Это обеспечивает более компактное представление и, возможно, более высокую производительность (плюсы), но с пониженной читабельностью (или, скорее, отладкой), что является недостатком.

Кроме того, оба имеют немного меньшую поддержку инструментов, чем стандартные форматы, такие как xml (и, возможно, даже json).

(РЕДАКТИРОВАТЬ) Вот Интересное сравнение , которое учитывает различия в размерах и производительности, а также включает числа для некоторых других форматов (xml, json).

7
StaxMan

Протоколные буферы, кажется, имеют более компактное представление, но это только впечатление, которое я получаю, читая технический документ Thrift. Своими словами:

Мы отказались от некоторых крайних оптимизаций хранения (т. Е. Упаковываем Маленькие целые числа в ASCII или используем 7-битный формат продолжения) Ради простоты и ясности в коде. Эти изменения может быть легко сделано, если и когда мы столкнемся с критикой производительности случай использования, который требует их.

Кроме того, это может быть просто моим впечатлением, но протоколные буферы, кажется, имеют более толстые абстракции вокруг версионирования структуры. Thrift действительно имеет некоторую поддержку версий, но чтобы это произошло, нужно приложить немало усилий.

7
Daniel Spiewak

ProtocolBuffers быстрее.
Здесь есть хороший тест:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

Возможно, вы также захотите заглянуть в Avro, поскольку Avro еще быстрее.
У Microsoft есть пакет здесь:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro ​​

Кстати, самый быстрый, который я когда-либо видел, это Cap'nProto ;
Реализацию на C # можно найти в Github-репозитории Марка Гравелла .

6
Stefan Steiger

И согласно wiki среда выполнения Thrift не работает в Windows.

6
hplbsh

Я думаю, что большинство из этих моментов упущено из основного факта, что Thrift является платформой RPC, которая может сериализовать данные, используя различные методы (двоичный, XML и т.д.).

Буферы протокола предназначены исключительно для сериализации, это не фреймворк, как Thrift. 

3
Babra Cunningham

С одной стороны, protobuf не является полной реализацией RPC. Для этого требуется что-то вроде gRPC. 

gPRC очень медленный по сравнению с Thrift:

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

2
trilogy

Также важно отметить, что не все поддерживаемые языки совместимы с Thrift или Protobuf. На данный момент речь идет о реализации модулей в дополнение к базовой сериализации. Позаботьтесь о том, чтобы проверить контрольные показатели для любого языка, который вы планируете использовать.

0
JSON

Здесь есть несколько отличных моментов, и я собираюсь добавить еще один, если здесь кто-то пересечет путь.

Thrift дает вам возможность выбирать между thrift-binary и thrift-compact (de) сериализатором, thrift-binary будет иметь превосходную производительность, но больший размер пакета, тогда как thrift-compact даст вам хорошее сжатие, но требует большей вычислительной мощности. Это удобно, потому что вы всегда можете переключаться между этими двумя режимами так же легко, как менять строку кода (черт возьми, даже сделать ее настраиваемой). Так что, если вы не уверены, насколько ваше приложение должно быть оптимизировано для размера пакета или вычислительной мощности, экономия может быть интересным выбором.

PS: Посмотрите этот отличный тестовый проект от thekvs, который сравнивает многие сериализаторы, включая thrift-binary, thrift-compact и protobuf: https://github.com/thekvs/cpp-serializers

PS: есть еще один сериализатор с именем YAS, который также предоставляет эту опцию, но он не требует схемы (см. Ссылку выше).

0
Sinapse