Thrift、Avro、Protocol Buffers - 他们都死了吗?

50

在一个个人项目(cassandra、spark、hadoop、kafka)中,我需要一个数据序列化框架。查看了三种常见的框架 - 即Thrift、Avro和Protocolbuffers - 我注意到它们大多数似乎是死气沉沉的,每年最多只有两个小版本发布。

这让我有两个假设:

  • 它们已经像这样的框架一样完整,只要没有需要的新功能,就会进入维护模式
  • 此类框架没有存在的理由-不明显为什么。如果是这样,还有哪些可供选择的替代品?

如果有人能给我指点一下我的假设,任何意见都欢迎。


28
你希望你的序列化格式频繁地改变吗? - dlamblin
4个回答

41
Protocol Buffers是一个非常成熟的框架,最早在15年前由Google推出。它肯定不会被淘汰:几乎所有Google内部的服务都在使用它。但是经过这么多的使用,现在可能没有太多需要改变的地方了。事实上,他们今年发布了一个重大版本(3.0),但是这个版本更多的是删除特性而不是添加特性。
Protobuf的关联RPC系统gRPC相对较新,并且最近活动比较多。(但是它基于Google的内部RPC系统,该系统已经有12年的开发历史。)
我不太了解Thrift或Avro,但它们也存在了一段时间。

31
与Protobuf相比,Thrift的优势在于提供了完整的RPC和序列化框架。此外,Thrift支持约20多种目标语言,并且这个数字还在不断增长中。我们即将包括.NET Core,并且不久的将来会支持Rust。
过去几个月里并没有太多Thrift的发布,这当然需要解决,我们也充分意识到这一点。另一方面,代码库的整体稳定性相当好,因此用户可以从当前主分支上剪下一个Github分支,并采取通常的质量措施。
Avro和Thrift之间的主要区别在于Thrift是静态类型的,而Avro使用更加动态的方法。在大多数情况下,静态方法非常适合需求,这种情况下,Thrift让您受益于生成代码的更好性能。如果不是这种情况,Avro可能更加适合。
另外值得一提的是,除了Thrift、Protobuf和Avro之外,市场上还有一些其他的解决方案,比如Capt'n'proto或BOLT。

18
节约派(Thrift)提供了一个完整的远程过程调用(RPC)和序列化框架。Protobuf也有类似功能:http://grpc.io。 - Kenton Varda
2
但那是一个附加组件,不是核心protobuf。使用Thrift,您可以直接获得OOTB。 - JensG
25
我不同意。gRPC 和 Protobuf 是一起设计和构建的。它们被正确地模块化和分离,所以如果你不需要 RPC 系统,你可以避免它带来的臃肿,这是一个特性而不是缺陷。 - Kenton Varda
46
是的,我非常清楚Protobuf在2008年开源,因为我是那个项目的领导者,谢谢。 Protobuf最初的构思是在大约2001年,RPC系统在大约2004年诞生。不幸的是,当我开源Protobuf时,我没有足够的资源来准备RPC实现以供公开发布,因此这个过程直到后来才真正发生。尽管如此,事实仍然表明它们是一起开发的。 - Kenton Varda
4
@JensG,您能解释一下“Avro和Thrift之间的主要区别在于Thrift是静态类型”的段落是什么意思吗?这是Thrift的描述语言:https://thrift.apache.org/docs/idl 您是不是说这与Avro模式中表达的有根本的不同? Avro使用类型信息来实现比Thrift更高效的数据编码。 “未标记的数据:由于当读取数据时存在架构,因此需要使用较少的类型信息对数据进行编码,从而导致更小的序列化大小。” - pdxleif
显示剩余6条评论

2
关于节俭:据我所知,它仍然很流行。在我工作的地方,我们使用它进行序列化和内部 API,这个工具对此非常有效。

一些像连接多路复用和更加用户友好的客户端等缺失的功能已经通过 Twitter 的 Finagle 等项目进行了添加。

尽管我会将我们使用它的程度描述为“半重度”(即,我们不是首先考虑性能:它应该易于使用且无错误),但我们到目前为止没有遇到任何问题。

因此,关于 thrift,我会说它属于您提到的第一类。

Protocol Buffers 是 thrift 序列化部分的另一种选择,但它并没有提供 thrift 提供的 RPC 工具箱。

我不知道还有哪个项目将 RPC 和序列化融合成如此简单易用和完备的单一包中。

[*] 无论如何,一旦您开始使用它并看到所有的好处,将其归为第二类就很难了 :)


1
他们在很多地方都被广泛使用,所以我会选择你的第一个假设。我不知道你对发布计划的期望是什么,但对于这样一个规模和成熟度的库来说,它们似乎很正常。嘿,Avro 1.8.0在2016年初发布,大多数东西仍在使用Avro 1.7.7(例如Spark,Hadoop)。https://avro.apache.org/releases.html

Avro能让你序列化/反序列化现有的类吗?“入门指南”只有两种情况:1. 模型类是从模式生成的,2. 没有代码生成,但唯一的类ser/des是GenericRecord。我的情况没有涉及:使用JDK序列化数百个现有类,但想要更快的东西。似乎Arvo想要从头重新生成我所有的类,这行不通,因为它们不是贫血的——即完全面向对象的模型。我还读过一篇帖子,有人遇到了继承类的问题——对于一个Java框架来说,这似乎很奇怪。 - Volksman

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