Самые большие различия между буфером протокола и Thrift? - PullRequest
263 голосов

Ответы [ 14 ]

149 голосов
/ 16 сентября 2008

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

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

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

80 голосов
/ 03 августа 2009

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

  • Буферы протокола: 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

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

70 голосов
/ 28 марта 2010

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

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

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

55 голосов
/ 27 августа 2011

Как я уже сказал, "Thrift vs Protocol buffers" тема:

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

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

8 голосов
/ 03 мая 2010

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

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

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

7 голосов
/ 11 марта 2009

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

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

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

7 голосов
/ 16 сентября 2008

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

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

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

6 голосов
/ 29 августа 2014

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 голосов
/ 27 сентября 2009

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

...