Protocol buffers ApacheStrift、Google协议缓冲区、MessagePack、ASN.1和ApacheAvro之间的主要区别是什么?

Protocol buffers ApacheStrift、Google协议缓冲区、MessagePack、ASN.1和ApacheAvro之间的主要区别是什么?,protocol-buffers,thrift,asn.1,avro,Protocol Buffers,Thrift,Asn.1,Avro,所有这些都提供了二进制序列化、RPC框架和IDL。我对它们之间的关键区别和特性(性能、易用性、编程语言支持)感兴趣 如果您知道任何其他类似技术,请在回答中提及。ASN.1是ISO/ISE标准。它有一个非常可读的源语言和各种后端,包括二进制和人类可读的。作为一个国际标准(这是一个很老的标准!),源语言有点像厨房里的土(就像大西洋有点湿一样),但是它非常详细,并且有相当多的支持。(如果你足够努力的话,你可能会为你命名的任何语言找到一个ASN.1库,如果没有的话,你可以在FFIs中使用好的C语言库。)

所有这些都提供了二进制序列化、RPC框架和IDL。我对它们之间的关键区别和特性(性能、易用性、编程语言支持)感兴趣


如果您知道任何其他类似技术,请在回答中提及。

ASN.1是ISO/ISE标准。它有一个非常可读的源语言和各种后端,包括二进制和人类可读的。作为一个国际标准(这是一个很老的标准!),源语言有点像厨房里的土(就像大西洋有点湿一样),但是它非常详细,并且有相当多的支持。(如果你足够努力的话,你可能会为你命名的任何语言找到一个ASN.1库,如果没有的话,你可以在FFIs中使用好的C语言库。)它是一种标准化的语言,有大量的文档,并且有一些很好的教程

节俭不是标准。它最初来自Facebook,后来是开源的,目前是顶级Apache项目。它没有很好的文档记录——特别是教程级别——而且我(承认很简短)的一瞥似乎没有添加任何其他的东西,以前的工作还没有做(在某些情况下更好)。公平地说,它支持很多现成的语言,包括一些知名度较高的非主流语言。IDL也有点像C

协议缓冲区不是标准。这是一款正在向更广泛的社区发布的谷歌产品。它在语言上的支持是有限的(在它之外的语言支持)(它只支持C++,Python和java),但是它确实有很多第三方对其他语言(高度可变的质量)的支持。谷歌几乎所有的工作都使用协议缓冲区,因此它是一个经过战斗测试的、经过战斗考验的协议(虽然不像ASN.1那样经过战斗考验。它的文档比Thrift好得多,但是,作为谷歌的一个产品,它很可能是不稳定的(在不断变化的意义上,而不是不可靠的意义上).IDL也是C型的

上述所有系统都使用某种IDL中定义的模式为目标语言生成代码,然后用于编码和解码。Avro没有。Avro的键入是动态的,其模式数据在运行时直接用于编码和解码(这在处理过程中有一些明显的成本,但与动态语言相比也有一些明显的好处,并且不需要标记类型等)。它的模式使用JSON,如果已经有JSON库,那么在新语言中支持Avro会更容易管理。同样,与大多数重新发明的协议描述系统一样,Avro也没有标准化


就个人而言,尽管我喜欢/讨厌它,但我可能会将ASN.1用于大多数RPC和消息传输目的,尽管它实际上没有RPC堆栈(您必须制作一个,但IOC使其足够简单).

对于性能,一个数据点是基准测试——它是非常具体的小消息,但如果您在Java平台上,它可能会有所帮助。我认为性能通常不会是最重要的区别。另外:永远不要把作者的话当作福音;许多广告宣传都是假的(例如,msgpack站点有一些可疑的声明;它可能很快,但信息非常粗略,用例不太现实)

一个很大的区别是是否必须使用模式(PB,至少是Thrift;Avro它可能是可选的;我也认为是ASN.1;MsgPack,不一定)

另外:在我看来,能够使用分层的、模块化的设计是很好的;也就是说,RPC层不应该规定数据格式、序列化。不幸的是,大多数候选者都将这些紧密地捆绑在一起


最后,在选择数据格式时,现在的性能并不排除使用文本格式。有非常快速的JSON解析器(和非常快速的流式xml解析器)在考虑脚本语言的互操作性和易用性时,二进制格式和协议可能不是最佳选择。

ASN.1的一大特点是,ist是为规范而设计的,而不是为实现而设计的。因此,它非常擅长在任何“真实”中隐藏/忽略实现细节编程语言

ASN.1编译器的工作是将编码规则应用于asn1文件并从中生成可执行代码。编码规则可以用编码符号(ECN)表示,也可以是标准化规则之一,如BER/DER、PER、XER/EXER。 即ASN.1是类型和结构,编码规则定义在线编码,最后但并非最不重要的是编译器将其传输到编程语言

<>自由编译器支持C、C++、C、java和Erlang,我知道,(昂贵的和专利/许可证的)商业编译器非常通用,通常是最新的,有时甚至支持更多语言,但是看到他们的站点(OSS NokVaVa,Marben etc.)。 使用asn.1文件、编码规则(例如BER)和UML交互图(例如UML交互图)等技术,在完全不同编程文化的各方(例如“嵌入式”人员和“服务器农民”)之间指定接口非常容易。不必担心它是如何实现的,让每个人都使用“他们的东西”!对我来说,效果很好。 顺便说一句:在OSS Nokalva的网站上,你可以找到至少两本免费下载的关于ASN.1的书(一本是Larmouth的,另一本是Dubuisson的)

我知道,其他大多数产品都试图成为另一个RPC存根生成器,为序列化问题注入大量空气。好吧,如果有人需要的话,也许可以。但对我来说,它们看起来像是Sun RPC的翻版(从80年代末开始),但是,嘿,这是可行的
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!)