Avro 与 Protobuf 的性能指标

标签 performance serialization apache-kafka protocol-buffers avro

我们正在使用 kafka 来存储消息并推送大量消息(一分钟内超过 30k)。我不确定它是否相关,但作为 kafka 消息的生产者的代码在 jruby 中。

消息的序列化和反序列化也会对系统性能产生影响。

有人可以帮助在序列化和反序列化速度方面比较 Avro 与 Protocol Buffer。

最佳答案

我不想告诉你这个,但你的问题没有简单的答案。

序列化格式的性能取决于许多因素。首先,性能是实现的属性,而不是格式本身。您真正想知道的是每种格式的特定 JRuby 实现(或者 Java 实现,如果您只是包装它们)的性能如何。答案可能与其他语言(如 C++)的答案大不相同。

此外,性能会因您使用库的方式而异。许多图书馆的 API 提供了“简单、缓慢”方式和“快速、困难”方式之间的权衡。优化时,您需要仔细研究文档并查找库作者的示例代码,以了解如何最大限度地发挥性能。

最后——也是最重要的——根据您使用的数据,性能会有很大的不同。不同的格式和实现针对不同类型的数据进行优化。例如,字符串密集型数据将使用与数字密集型数据截然不同的代码路径。对于每一种格式——甚至是 JSON 和 XML*——总是可以找到一个用例,它们的性能优于其他所有用例。警惕来自库作者的基准,因为它们往往会强调对他们有利的用例。

不幸的是,如果您真的想知道哪种格式更适合您,那么您要找出的唯一方法是编写两个版本的代码,一个使用每个库,然后比较它们。没有任何外部基准能够为您提供真正的答案。

(我是 Protobuf v2 和 Cap'n Proto 的作者,所以我花了很多时间查看序列化基准并考虑性能。)

* 开玩笑的 XML。

关于Avro 与 Protobuf 的性能指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38174180/

相关文章:

python - Python 的 os.path.join 慢吗?

haskell - Haskell中如何实现多种外部格式的数据多态?

android - 实现 Parcelable 的类

azure - Strimzi 无法调整 PV 大小

java - Apache Kafka + Kryo 序列化

performance - 我应该相信 Redis 的数据完整性吗?

.net - WPF 打印速度非常慢

algorithm - 三重嵌套循环的复杂性

ruby-on-rails - rails : How to handle "Attribute was supposed to be a Array, but was a String" error?

java - 如何在Spring Kafka客户端中寻求偏移量?