Thrift、Protocol Buffers、JSON、EJB以及其他技术的性能比较?

70
我们正在研究运输/协议解决方案,并即将进行各种性能测试,因此我想向社区确认是否已经完成了以下测试:
在Linux上比较使用EJB3、Thrift和Protocol Buffers的简单回显服务以及序列化/反序列化不同消息大小的服务器性能测试?
主要涉及Java、C/C ++、Python和PHP语言。
更新:如果有人做过任何进一步的基准测试,请告诉我,我仍然非常感兴趣。此外,有一个非常有趣的基准测试显示,压缩JSON的表现与Thrift / Protocol Buffers类似/更好,因此我也将JSON加入到这个问题中。

谢谢。我很想在其中看到Fast Infoset(ITU-T Rec. X.891 | ISO/IEC 24824-1)和EXI(W3C)。 - nealmcb
从https://code.google.com/p/thrift-protobuf-compare/wiki/BeyondNumbers 看来,JSON基准测试只是手动将缩写字符串写入输出。 - Audrius Meškauskas
我目前每天都在使用protobufers进行工作,我的经验告诉我,基准测试并不能说明某人必须在序列化或反序列化时的内存消耗情况。一个例子是OSI开放模拟接口,它是一个复杂的消息和数组网络。如果你尝试对其进行序列化,并将其与任何其他协议进行比较,情况会有所不同。我的意思是,你必须进行实验,尝试使用不同的协议构建相同的系统,然后为你的情况进行比较和决策。特别是当你正在尝试... - Marko Bencik
8个回答

56

16

我正在编写一些代码,涉及比较开源项目thrift-protobuf-compare中的protobuf和thrift。目前它涵盖了一些序列化方面,但我打算涵盖更多内容。我的博客上讨论了ThriftProtobuf的结果,我会在以后添加更多内容。 你可以查看代码来比较API、描述语言和生成的代码。我很乐意接受贡献,以实现更全面的比较。


9
我刚刚向那个问题添加了一条注释 - 你正在使用协议缓冲区的默认选项,这意味着“优化代码大小”。这会对性能产生巨大影响(但会导致代码更小)。你应该打开 optimize_for = SPEED 进行比较。 - Jon Skeet

8

8
我测试了PB和其他数据格式(xml、json、默认对象序列化、hessian、一种专有的格式)以及库(jaxb、fast infoset、手写)在数据绑定任务上(包括读取和写入),但没有涉及thrift的格式。针对具有多个转换器(如xml)的格式,性能变化范围很大,从非常慢到相当快。作者声称的性能与实际表现之间的相关性相当弱。特别是对于那些声称最大的包,情况更是如此。
就性能而言,我发现PB的表现被过分夸大了(通常不是由其作者夸大的,而是由其他只知道谁编写了它的人)。使用默认设置时,它并没有超越最快的文本xml替代品。通过优化模式(为什么这不是默认值?),它稍微快了一点,与最快的JSON包相当。Hessian也相当快,文本json也是如此。专有的二进制格式(这里不提供名称,它是公司内部的)是最慢的。Java对象序列化对于较大的消息来说很快,对于小对象来说则不太快(即每个操作的高固定开销)。 使用PB,消息大小紧凑,但考虑到你必须做出的所有权衡(数据不是自描述的:如果你失去了模式,你就会失去数据;当然有索引和值类型,但如果你想要反向工程回到字段名称,你必须做出权衡),我个人只会选择它用于特定的用例--大小敏感、紧密耦合的系统,其中接口/格式几乎从不(或者非常非常少)改变。
我的观点是,(a)实现通常比规范更重要(数据格式),(b)从端到端,最优秀的(针对不同格式)之间的差别通常不足以决定选择。 也就是说,您可能最好选择您最喜欢使用的格式+API/lib/framework,找到最佳实现,并查看是否足够快。 如果(仅当!)不行,请考虑下一个最佳替代方案。
附注:不确定这里的EJB3是什么。也许只是Java序列化?

也许你可以在博客文章中发布这些结果?我肯定会对详细信息感兴趣,特别是关于XML测试的部分。 - Parand
1
好的。核心部分位于“StaxBind”模块下,使用Codehaus上的Woodstox(http://woodstox.codehaus.org)存储库;这只是为了方便。没有任何与Woodstox特定相关的内容。我会尝试发布结果--如果没有人能够重现它们,那将是令人沮丧的。 - StaxMan

5
如果原始的网络性能是目标,那么没有什么比IIOP更好的选择(请参阅RMI/IIOP)。最小可能的占用空间 - 只有二进制数据,没有任何标记。序列化/反序列化也非常快。
由于它是IIOP(即CORBA),几乎所有的语言都有绑定。
但我想你不仅仅需要高性能,对吧?

1
性能肯定不是唯一的要求。其他的需求我们已经掌握或者可以相对容易地进行评估;而性能则是我希望得到反馈的方面。 - Parand
3
“仅限二进制数据”并不意味着一定是最小的数据占用空间。例如,您可以将Int32作为“只有4个字节”传输,也可以使用编码来减少小值的传输大小,但代价是对大值使用更多的数据。 - Jon Skeet
3
根据我的经验,不用担心紧凑的位压缩协议,直接使用zlib流压缩数据更加经济实惠。不需要的位数填充0后进行压缩效果很好(假设你初始化了缓冲区)。这通常比手动位压缩更加优秀,并且也更容易调试,前提是zlib是可行的选择。 - scobi

4

我“待办事项”清单上的首要任务之一是将谷歌内部的Protocol Buffer性能基准移植过来——这主要涉及将机密消息格式转换为完全平淡无奇的格式,然后对数据执行相同操作。

完成此操作后,我想你可以在Thrift中构建相同的消息,然后比较性能。

换句话说,我现在还没有相关的数据,但希望在接下来的几周内能够提供给您...


如果您已经完成了某些工作,那么Thrift-protobuf-comparison项目(http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking)将是一个很好的归宿。看到不同的用例会很棒 - 当前的用例只涉及非常小的消息,这只是其中的一个方面。 - StaxMan
1
我现在有一个基准测试框架,但它主要是针对 Protocol Buffers 的不同实现和不同消息进行基准测试。请参见 http://code.google.com/p/protobuf-csharp-port/wiki/ProtoBench。 - Jon Skeet

3

为了支持Vladimir关于IIOP的观点,这里有一个有趣的性能测试,可以提供一些额外的信息,因为它比较了Thrift和CORBA。(Performance_TIDorb_vs_Thrift_morfeo.pdf // 链接不再有效) 引用研究中的话:

  • Thrift在处理小数据(基本类型作为操作参数)方面非常高效。
  • 与CORBA相比,Thrift的传输在处理中大型数据(struct和复杂类型> 1千字节)时不太高效。

另一个奇怪的限制,与性能无关,是Thrift仅限于将几个值作为结构返回 - 尽管这个问题像性能问题一样可以得到改善。

有趣的是,Thrift IDL 与 CORBA IDL 非常相似,这很好。我没有使用过 Thrift,它看起来很有趣,特别是对于较小的消息,而且一个设计目标是更少的繁琐安装,这些都是 Thrift 的其他优点。尽管如此,CORBA 拥有不好的声誉,但是像 omniORB 这样的许多优秀实现已经存在,并且具有易于安装和使用的 Python 绑定。 编辑:Thrift 和 CORBA 的链接已不再有效,但我找到了 CERN 的另一篇有用论文。他们评估了替换他们的 CORBA 系统的方案,虽然他们评估了 Thrift,但最终他们选择了 ZeroMQ。虽然在性能测试中 Thrift 表现最佳,达到了每秒 9000 条消息,而 ZeroMQ 是 8000 条,而基于 CORBA 的 RDA 是 7000 多条,但由于其他问题,特别是:

它仍然是一个带有错误实现的不成熟产品

他们选择不进一步测试 Thrift。

2
我为了工作做了一个研究,研究了Spring Boot、手动映射器、Dozer、MapStruct、Thrift、REST、SOAP和Protocol Buffers的集成。

服务器端:https://github.com/vlachenal/webservices-bench

客户端:https://github.com/vlachenal/webservices-bench-client

它还没有完成,已经在我的个人电脑上运行(我必须请求服务器来完成测试)......但结果可以在以下链接中查看:

结论如下:

节俭(Thrift)提供了最佳性能并易于使用;带有JSON内容类型的RESTful Web服务接近于Thrift的性能,可以“即刻在浏览器中使用”,而且相当优雅(在我看来);SOAP性能非常差,但提供了最佳数据控制;协议缓冲区(Protocol Buffers)具有良好的性能......直到3个同时调用...我不知道为什么。它很难使用:我放弃了(暂时)使用MapStruct让它工作,也不尝试使用Dozer。

项目可以通过拉取请求(无论是修复还是其他结果)完成。


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。- 来自审查 - mx0
好的,抱歉之前我的帖子不够清晰。我已经添加了我的结论。如果需要更多细节,我会补充说明。 - user4047208

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接