Каковы основные плюсы и минусы Apache Thrift против буферов протокола Google ?
Каковы основные плюсы и минусы Apache Thrift против буферов протокола Google ?
Ответы:
Они оба предлагают много одинаковых функций; Тем не менее, есть некоторые различия:
Set
типПо сути, они довольно эквивалентны (с тем, что буфер протокола немного более эффективен, чем я читал).
map
также
Еще одним важным отличием являются языки, поддерживаемые по умолчанию.
Оба могут быть расширены для других платформ, но это привязки языков, доступные из коробки.
RPC - еще одно ключевое отличие. Thrift генерирует код для реализации RPC-клиентов и серверов, где буферные протоколы, по-видимому, в основном предназначены только для обмена данными.
option optimize_for = SPEED
.Для более детального изучения различий ознакомьтесь с различиями исходного кода в этом проекте с открытым исходным кодом .
Как я уже сказал в теме «Базы протокола Thrift против протокола» :
Ссылаясь на сравнение Thrift против Protobuf против JSON :
Кроме того, есть множество интересных дополнительных инструментов, доступных для этих решений, которые могут решить. Вот примеры для Protobuf: Protobuf-wireshark , protobufeditor .
Протоколные буферы, кажется, имеют более компактное представление, но это только впечатление, которое я получаю, читая технический документ Thrift. Своими словами:
Мы решили не использовать крайнюю оптимизацию хранения (например, упаковывать маленькие целые числа в ASCII или использовать 7-битный формат продолжения) ради простоты и ясности в коде. Эти изменения могут быть легко сделаны, если и когда мы столкнемся с критичным к производительности вариантом использования, который требует их.
Кроме того, это может быть просто моим впечатлением, но протоколные буферы, кажется, имеют более толстые абстракции вокруг версионирования структуры. У Thrift есть поддержка версий, но чтобы это произошло, нужно приложить немало усилий.
Мне удалось добиться лучшей производительности с текстовым протоколом по сравнению с protobuff на python. Тем не менее, нет проверки типов или других необычных преобразований utf8 и т. Д., Которые предлагает protobuff.
Итак, если вам нужна сериализация / десериализация, то вы можете использовать что-то еще.
http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html
Одна очевидная вещь, еще не упомянутая, заключается в том, что они могут быть как за, так и против (и одинаковы для обоих), - это то, что они являются двоичными протоколами. Это обеспечивает более компактное представление и, возможно, более высокую производительность (плюсы), но с пониженной читабельностью (или, скорее, отладкой), что является недостатком.
Кроме того, оба имеют немного меньшую поддержку инструментов, чем стандартные форматы, такие как xml (и, возможно, даже json).
(РЕДАКТИРОВАТЬ) Вот интересное сравнение, которое учитывает различия в размерах и производительности, а также включает числа для некоторых других форматов (xml, json).
И, согласно вики, среда выполнения Thrift не работает в Windows.
ProtocolBuffers быстрее.
Здесь есть хороший тест:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
Возможно, вы также захотите заглянуть в Avro, поскольку Avro еще быстрее.
У Microsoft есть пакет здесь:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro
Кстати, самый быстрый, который я когда-либо видел, это Cap'nProto ;
Реализацию AC # можно найти в Github-репозитории Marc Gravell .
Я думаю, что большинство из этих моментов упущено из основного факта, что Thrift является платформой RPC, которая, как оказалось, способна сериализовать данные, используя различные методы (двоичный, XML и т. Д.).
Протоколные буферы предназначены исключительно для сериализации, это не основа, как Thrift.
С одной стороны, protobuf не является полной реализацией RPC. Для этого требуется что-то вроде gRPC.
gPRC очень медленный по сравнению с Thrift:
Здесь есть несколько отличных моментов, и я собираюсь добавить еще один, если кто-то пересечет здесь путь.
Thrift дает вам возможность выбирать между Thrift-двоичным и Thrift-компактным (де) сериализатором, Thrift-двоичный файл будет иметь отличную производительность, но больший размер пакета, тогда как Thrift-Compact даст вам хорошее сжатие, но требует большей вычислительной мощности. Это удобно, потому что вы всегда можете переключаться между этими двумя режимами так же легко, как менять строку кода (черт, даже сделать ее настраиваемой). Так что, если вы не уверены, насколько ваше приложение должно быть оптимизировано под размер пакета или вычислительную мощность, экономия может быть интересным выбором.
PS: Посмотрите этот превосходный тестовый проект, в thekvs
котором сравниваются многие сериализаторы, включая thrift-binary, thrift-compact и protobuf: https://github.com/thekvs/cpp-serializers.
PS: есть еще один названный сериализатор, YAS
который также предоставляет эту опцию, но он не требует схем, см. Ссылку выше.