我们正在研究传输/协议解决方案,并准备进行各种性能测试,所以我想我应该向社区咨询一下他们是否已经这样做了:

有没有人对 Linux 上的简单 echo 服务以及各种消息大小的序列化/反序列化进行服务器性能测试,比较 EJB3、Thrift 和 Protocol Buffer?

主要语言是 Java、C/C++、Python 和 PHP。

更新:我对此仍然非常感兴趣,如果有人做了任何进一步的基准测试,请告诉我。另外,非常有趣的基准显示 压缩 JSON 的性能与 Thrift / Protocol Buffers 相似/更好, ,所以我也将 JSON 放入这个问题中。

有帮助吗?

解决方案

thrift-protobuf-compare 项目维基上的最新比较。它包括许多其他序列化库。

其他提示

我正在名为thrift的开源项目中编写一些代码-protobuf-compare 比较protobuf和thrift。目前它涵盖了很少的序列化方面,但我打算涵盖更多。结果( Thrift Protobuf )在我的博客中进行了讨论,当我接触到它时,我会添加更多内容。 您可以查看代码来比较API,描述语言和生成的代码。我很乐意为实现更全面的比较做出贡献。

我测试了PB的性能,包括其他数据格式(xml,json,默认对象序列化,粗麻布,一个专有)以及用于数据绑定任务的库(jaxb,快速信息集,手写)(包括读取和写作),但没有包括节俭的格式。具有多个转换器(如xml)的格式的性能具有非常高的变化,从非常慢到非常快。作者的主张与感知表现之间的相关性相当弱。对于那些制造最大声称的包裹尤其如此。

对于它的价值,我发现PB表现有点夸张(通常不是作者,而是其他只知道是谁写的)。使用默认设置,它没有超过最快的文本xml替代品。使用优化模式(为什么这不是默认模式?),它速度更快,与最快的JSON包相比。 Hessian相当快,文本json也。专有的二进制格式(这里没有名称,它是公司内部)是最慢的。 Java对象序列化对于较大的消息来说是快速的,对于小对象来说则较少(即,每个操作的高操作率)。 PB的消息大小是紧凑的,但是你需要做的所有权衡(数据不是自我描述的:如果丢失了模式,你会丢失数据;当然有索引和值类型,但是你有什么如果你愿意,可以反向工程回到字段名称,我个人只会选择它用于特定用例 - 大小敏感,紧密耦合的系统,其中接口/格式永远不会(或非常非常罕见)发生变化。

我的观点是(a)实施通常比规范(数据格式)更重要,(b)端到端,同类最佳(针对不同格式)之间的差异通常不够大决定选择。 也就是说,你可能最好选择你最喜欢的格式+ API / lib /框架(或者有最好的工具支持),找到最佳实现,看看它是否足够快。 如果(并且只有!)没有,请考虑下一个最佳选择。

PS。不确定这里的EJB3是什么。也许只是简单的Java序列化?

我的<!>“to-do <!>”顶部附近的一个东西; PB的列表是移植谷歌的内部协议缓冲区性能基准测试 - 它主要是采用机密消息格式并将其转换为完全平淡的消息格式,然后对数据执行相同操作。

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

换句话说,我还没有你的数据 - 但希望在接下来的几周内...

如果原始网络性能是目标,那么没有什么比IIOP更好(参见RMI / IIOP)。 最小可能的占用空间 - 仅二进制数据,根本没有标记。序列化/反序列化也非常快。

由于它是IIOP(即CORBA),几乎所有语言都有绑定。

但我认为表现不是唯一要求,对吗?

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

  • 节俭对于小数据(基本类型作为操作参数)非常有效
  • 节俭运输不如具有中等和 大数据(结构和>复杂 类型> 1 KB)。

另一个奇怪的限制,与性能无关,是 Thrift 仅限于以结构形式返回几个值 - 尽管这与性能一样,也许肯定可以改进。

有趣的是,Thrift IDL 与 CORBA IDL 非常匹配,这很好。我没有使用过 Thrift,它看起来很有趣,尤其是对于较小的消息,而且设计目标之一是减少安装的繁琐,所以这些是 Thrift 的其他优点。也就是说,CORBA 名声不佳,但有许多优秀的实现,例如 全方位ORB 例如,它具有 Python 绑定,易于安装和使用。

编辑:Thrift 和 CORBA 链接不再有效,但我确实从 CERN 找到了另一篇有用的论文。他们评估了 CORBA 系统的替代方案,并且,虽然他们 评估节俭, ,他们最终选择了 ZeroMQ。虽然 Thrift 在性能测试中表现最快,为 9000 条消息/秒,而8000(ZeroMQ)和 7000+ RDA(基于 CORBA),他们选择不再进一步测试 Thrift,因为其他问题值得注意:

它仍然是一个不成熟的产品,实施过程中存在缺陷

我为我的工作研究了 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。

项目可以通过拉取请求(修复或其他结果)来完成。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top