Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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

(EDIT) Здесь Интересное сравнение, в котором рассматриваются как различия в размере, так и производительности, и включает номера для некоторых других форматов (xml, json) как хорошо.

Ответ 9

И согласно wiki, время выполнения Thrift не запускается в Windows.

Ответ 10

ПротоколBuffers является ОСНОВНЫМ.
Здесь есть хороший ориентир:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

Вы также можете посмотреть в Avro, поскольку Avro еще быстрее.
У Microsoft есть пакет:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro

Кстати, самый быстрый из всех, что я когда-либо видел, Cap'nProto;
Реализация С# можно найти в Github-хранилище Marc Gravell.

Ответ 11

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

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

Ответ 12

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

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

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

Ответ 13

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

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

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

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

Ответ 14

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