Каковы ключевые различия между Apache Rebift, буферами протокола Google, MessagePack, ASN.1 и Apache Avro?

StackOverflow https://stackoverflow.com/questions/4633611

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Все вышеперечисленные системы используют схему, определенную в каком-то IDL для генерации кода для целевого языка, который затем используется в кодировке и декодировании. AVRO нет. Набор текстов AVRO - это динамически, и данные его схемы используются во время выполнения непосредственно как для кодирования, так и для декодирования (у которых есть некоторые очевидные затраты в обработке, но и некоторые очевидные преимущества Viss Vis Dynamic языки и отсутствие необходимости в типов тегов и т. Д.) Отказ Его схема использует JSON, которая делает поддержку AVRO на новом языке немного легче управлять, если уже есть библиотека JSON. Опять же, как и с большинством колесо, ориентирующихся на протокол Описание системы, AVRO также не стандартизирован.

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

Другие советы

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

Комифта = сериализация + стек RPC

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

ASN.1 = Гранд Папа

ASN.1 был разработан со стороны Telecom Folks в 80-х и неловко Чтобы использовать из-за ограниченной поддержки библиотеки по сравнению с недавними сериализаторами, возникающими от людей COPSCI. Существуют два варианта кодирования кодирования и PEM (ASCII). Оба быстрые, но есть быстрее и более различия в двух. На самом деле ASN.1 дер может легко сохранить (и иногда бить) сериализаторы, которые были разработаны 30 лет После себя, свидетельство о том, что он хорошо спроектирован дизайн. Это очень компактно, меньший, чем буферы протоколов и комиссионов, пробитого только AVRO. Проблема имеет отличные библиотеки для поддержки и прямо сейчас Bouncy Castle, кажется, лучший для C # / Java. ASN.1 - король в безопасности и криптовых системах, и не собирается уходить, поэтому не беспокоитесь о «будущем проверке». Просто получите хорошую библиотеку ...

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

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

Общий

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

Буферы протокола (возник в Google), AVRO (Apache на основе, используемый в Hadoop), Rebift (Facebook возникла, теперь Apache Project) и ASN.1 (Telecom regificed) все включают в себя некоторые уровни генерации кода, где вы впервые выражаете свои данные в сериализатор -Specific формат, затем сериализатор «компилятор» будет генерировать исходный код для вашего языка через code-gen фаза. Затем ваш приложение использует эти code-gen Классы для IO. Обратите внимание, что некоторые реализации (например,: библиотека Microsoft AVRO или ProTobuf intobuf.net) позволяет напрямую украсить объекты POCO / POCO / POJO POCO / POJO, а затем библиотека напрямую использует эти украшенные классы. Мы видели, что это предложит повышение производительности, поскольку это устраняет этап экземпляра объекта (из полей уровня приложения Poco / POJO к полям Code-GEN).

Некоторые результаты и живой проект для игры с

Этот проект (https://github.com/sidsheteee/serializerspare.) сравнивает важные сериализаторы в мире C #. У Java Fuilk уже есть что-то похожее.

1000 iterations per serializer, average times listed
Sorting result by size
Name                Bytes  Time (ms)
------------------------------------
Avro (cheating)       133     0.0142
Avro                  133     0.0568
Avro MSFT             141     0.0051
Thrift (cheating)     148     0.0069
Thrift                148     0.1470
ProtoBuf              155     0.0077
MessagePack           230     0.0296
ServiceStackJSV       258     0.0159
Json.NET BSON         286     0.0381
ServiceStackJson      290     0.0164
Json.NET              290     0.0333
XmlSerializer         571     0.1025
Binary Formatter      748     0.0344

Options: (T)est, (R)esults, s(O)rt order, (S)erializer output, (D)eserializer output (in JSON form), (E)xit

Serialized via ASN.1 DER encoding to 148 bytes in 0.0674ms (hacked experiment!)

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

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

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

Наша цель состояла в том, чтобы найти комбинацию протокола кодирования и алгоритма сжатия с самым компактным результатом на высочайшей скорости. Мы проверили кодирование протокола и комбинации алгоритма протокола сжатия на 2,219 псевдорандом анонимализируемых поездок от Uber New Yorky (поставить в текстовый файл как json).

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

Размер результатов

Size Results

Скорость результатов

enter image description here

Одна большая вещь о ASN.1, что IST предназначен для Технические характеристики нет реализация. Поэтому он очень хорошо скрывает / игнорируя детали реализации в любом «реальном» языке программирования.

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

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

Удивительно легко указать интерфейс между сторонами совершенно разных программных культур (например, «встроенные» люди и «серверные фермеры»), используя эти методы: ASN.1-файл, правило кодирования EG BER и например, диаграмма взаимодействия UML Отказ Не волнуйтесь, как это реализуется, пусть все используют «их вещь»! Для меня это работало очень хорошо. Кстати: на сайте Оссу Нокальвы вы можете найти как минимум два бесплатных книги по скачиванию о ASN.1 (один от Larmuth другой By Dubuisson).

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top