Каковы основные различия между Apache Thrift, Google Protocol Buffers, MessagePack, ASN.1 и Apache Avro?



все они обеспечивают двоичную сериализацию, рамки RPC и IDL. Меня интересуют ключевые различия между ними и характеристики (производительность, простота использования, поддержка языков программирования).



Если вы знаете какие-либо другие подобные технологии, пожалуйста, укажите это в ответе.

529   6  

6 ответов:

ASN.1 является стандартом ISO/ISE. Он имеет очень читаемый исходный язык и множество бэк-эндов, как двоичных, так и читаемых человеком. Будучи международным стандартом (и старым при этом!) исходный язык немного кухонный (примерно так же, как Атлантический океан немного влажный), но он очень хорошо определен и имеет приличную поддержку. (Вы, вероятно, можете найти ASN.1 библиотека для любого языка, который вы называете, если вы копаете достаточно сильно, и если нет доступны ли хорошие библиотеки языка C, которые можно использовать в FFIs.) Это, будучи стандартизированным языком, одержимо документированным и имеет несколько хороших учебных пособий.

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

Протокол Буферы - это не стандарт. Это продукт Google, который выпускается для более широкого сообщества. Он немного ограничен с точки зрения языков, поддерживаемых из коробки (он поддерживает только C++, Python и Java), но у него есть много сторонней поддержки для других языков (очень переменного качества). Google делает почти всю свою работу с использованием буферов протоколов, поэтому это боевой тестированный, закаленный в боях протокол (хотя и не такой закаленный в боях, как ASN.1 это. Он имеет гораздо лучшую документацию, чем бережливость, но, будучи продуктом Google, он, скорее всего, будет нестабильным (в смысле постоянно меняющегося, а не в смысле ненадежного). IDL также является C-подобным.

все вышеперечисленные системы используют схема, определенная в некотором IDL для генерации кода для целевого языка, который затем используется в кодировании и декодировании. Авро-нет. Типизация Avro является динамической, и ее данные схемы используются во время выполнения непосредственно как для кодирования, так и для декодирования (что имеет некоторые очевидные затраты на обработку, но также некоторые очевидные преимущества по сравнению с динамическими языками и отсутствием необходимости в типах тегов и т. д.). Его схема использует JSON, что делает поддержку Avro на новом языке немного легче управлять, если уже есть JSON-библиотекой. Опять же, как и в большинстве систем описания протоколов с изобретением колес, Avro также не стандартизирован.

лично, несмотря на мои отношения любви/ненависти с ним, я бы, вероятно, использовал ASN.1 для большинства целей RPC и передачи сообщений, хотя на самом деле у него нет стека RPC (вам нужно будет сделать его, но IOCs делают это достаточно просто).

мы только что провели внутреннее исследование сериализаторов, вот некоторые результаты (для моей будущей ссылки тоже!)

бережливость = сериализация + стек RPC

самое большое различие заключается в том, что бережливость-это не просто протокол сериализации, это полномасштабный стек RPC, который похож на современный стек SOAP. Так что после сериализации объектов может (но не обязательно) быть отправлены между машинами по TCP / IP. В SOAP вы начали с WSDL документ, который полностью описывает доступные службы (удаленные методы) и ожидаемые аргументы/объекты. Эти объекты были отправлены через XML. В бережливости, то .thrift file полностью описывает доступные методы, ожидаемые объекты параметров и объекты сериализуются с помощью одного из доступных сериализаторов (с Compact Protocol эффективный двоичный протокол, наиболее популярные в производстве).

ASN.1 = Большой Папочка

ASN.1 был разработан телекоммуникационными людьми в 80-х годах и является неудобно использовать из-за ограниченной поддержки библиотеки по сравнению с недавними сериализаторами, которые появились у людей CompSci. Существует два варианта: кодирование DER (двоичное) и кодирование PEM (ascii). Оба быстры, но DER быстрее и эффективнее по размеру из двух. На самом деле АСН.1 DER может легко поддерживать (а иногда и бить) сериализаторы, которые были разработаны 30 лет после себя завещание, чтобы его хорошо продуманная конструкция. Это очень компактный, меньше, чем буферы протокола и бережливость, только побитая Авро. Проблема в том, что у вас отличные библиотеки для поддержки, и прямо сейчас Bouncy Castle кажется лучшим для C#/Java. АСН.1 является королем в системах безопасности и криптографии и не собирается уходить, поэтому не беспокойтесь о "будущих проверках". Просто возьми хорошую библиотеку...

MessagePack = середина пакета

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

Common

кроме того, они довольно похожи. Большинство из них являются вариантами основного TLV: Type-Length-Value принципе.

буферы протокола (Google возник), Avro (Apache на основе, используется в Hadoop), бережливость (Facebook возник, теперь проект Apache) и ASN.1 (Telecom originated) все они включают некоторый уровень генерации кода, где вы сначала выражаете свои данные в формате, специфичном для сериализатора, затем сериализатор "компилятор" будет генерировать исходный код для вашего языка через

одна большая вещь о ASN.1-это то, что ist предназначен для спецификацияне реализация. Поэтому он очень хорошо скрывает / игнорирует детали реализации на любом "реальном" языке программирования.

Это работа ASN.1-компилятор для применения правил кодирования к asn1-файлу и генерирования из них исполняемого кода. Правила кодирования могут быть заданы в нотации кодирования (ECN) или могут быть одним из стандартизированных, таких как BER / DER, PER, XER / EXER. Что такое ASN.1-это типы и структуры, правила кодирования определяют кодировку на проводе, и, наконец, не в последнюю очередь компилятор передает ее на ваш язык программирования.

насколько мне известно,бесплатные компиляторы поддерживают C,C++, C#, Java и Erlang. Коммерческие компиляторы (очень дорогие и патентные/лицензии) очень универсальны, обычно абсолютно современные и поддерживают иногда даже больше языков, но см. Их сайты (OSS Nokalva, Marben так далее.).

удивительно легко указать интерфейс между сторонами совершенно разных культур программирования (например. "встроенные" люди и" фермеры серверов"), используя эти методы: asn.1-файл, правило кодирования, например, BER и, например, диаграмма взаимодействия UML. Не беспокойтесь, как это реализовано, пусть каждый использует "свою вещь"! Для меня это сработало очень хорошо. Кстати.: На сайте OSS Nokalva вы можете найти по крайней мере две бесплатные для скачивания книги об ASN.1 (один Larmouth другой Дюбюиссон).

IMHO большинство других продуктов пытаются быть только еще-другими-RPC-stub-генераторами, накачивая много воздуха в проблему сериализации. Ну, если кому-то это нужно, он может быть в порядке. Но для меня они выглядят как переосмысления Sun-RPC (с конца 80-х годов), но, эй, это тоже сработало отлично.

добавляя к перспективе производительности, Uber недавно оценил несколько из этих библиотек в своем инженерном блоге:

https://eng.uber.com/trip-data-squeeze/

победитель для них? MessagePack + zlib для сжатия

нашей целью было найти комбинацию протокола кодирования и алгоритм сжатия с наиболее компактным результатом на самом высоком уровне скорость. Мы протестировали протокол кодирования и алгоритм сжатия комбинации на 2219 псевдослучайных анонимных поездках из Uber Нью-Йорк Город (помещается в текстовый файл как JSON).

урок здесь заключается в том, что ваши требования определяют, какая библиотека подходит именно вам. Для Uber они не могли использовать протокол на основе IDL из-за отсутствия схем передачи сообщений, которые у них есть. Это устранило кучу вариантов. Также для них это не только сырое время кодирования/декодирования, которое вступает в игру, но и размер данных в состоянии покоя.

размер Результаты

Size Results

Результаты Скорости

enter image description here

облигация Microsoft (https://github.com/Microsoft/bond) Очень впечатляет производительностью, функциональностью и документацией. Однако на данный момент он не поддерживает многие целевые платформы ( 13 февраля 2015 года ). Я могу только предположить, что это потому, что это очень новое. в настоящее время он поддерживает python, c# и c++ . Он используется MS везде. Я попробовал это, для меня как разработчика c# использование bond лучше, чем использование protobuf, однако я также использовал бережливость, единственная проблема, с которой я столкнулся, была с документацией мне пришлось попробовать много вещей, чтобы понять, как это делается.

несколько ресурсов на облигации следующим образом ( https://news.ycombinator.com/item?id=8866694 , https://news.ycombinator.com/item?id=8866848 , https://microsoft.github.io/bond/why_bond.html)

для производительности одной точкой данных является в JVM-сериализаторы тест -- это вполне конкретные, небольшие сообщения, но может помочь, если вы находитесь на платформе Java. Я думаю, что производительность в целом часто не самое главное отличие. Также: никогда не принимайте слова авторов как Евангелие; многие рекламируемые претензии являются фиктивными (например, сайт msgpack имеет некоторые сомнительные претензии; это может быть быстро, но информация очень отрывочна, случай использования не очень реалистичен).

одна большая разница должна ли использоваться схема (PB, бережливость по крайней мере; Avro это может быть необязательно; ASN.1 я думаю также; MsgPack, не обязательно).

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

наконец, при выборе формата данных, в настоящее время не исключает использование текстовых форматах. Есть пылающие быстрые Парсеры JSON (и довольно быстрые потоковые XML-Парсеры); и при рассмотрении совместимости с языками сценариев и простоты использования двоичные форматы и протоколы могут быть не лучшим выбором.

Comments

    Ничего не найдено.