Protocol Buffers, Avro, Thrift & MessagePack

原文

一个新的谷歌开发人员 (Noogler) 在深入研究代码后首先不可避免的观察之一可能是协议缓冲区 (PB) 是谷歌的“数据语言”。 简而言之,Protocol Buffers 用于序列化、RPC 以及介于两者之间的所有内容。

最初在 2000 年代早期开发为优化的服务器请求/响应协议(因此得名),它们已成为事实上的数据持久性格式和 RPC 协议。 后来,在 2008 年进行了重大 (v2) 重写之后,Protocol Buffers 由 Google 开源,现在,通过许多第三方扩展,可以在数十种语言中使用——当然包括 Ruby。

但是,Protocol Buffers 是万能的吗? 嗯,它似乎适用于 Google,但更重要的是,我认为这是一个很好的例子,说明了解每个开发的历史背景与比较功能和基准测试速度一样有用。

Protocol Buffers vs. Thrift

让我们退后一步,将 Protocol Buffers 与“竞争对手”进行比较,其中有很多。在 PB、ThriftAvroMessagePack 之间,哪个最好?事实是,它们都非常好,每个都有自己的长处。因此,答案同样取决于个人选择,以及对每个人的历史背景的理解,并正确识别你自己的个人需求。

在最初开发 Protocol Buffers 时(2000 年初),Google 的首选语言是 C++(现在,Java 与其相当)。因此,PB 是强类型的,有一个单独的模式文件,并且还需要一个编译步骤来输出特定于语言的样板来读取和序列化消息,这应该不足为奇。为此,Google 定义了自己的语言 (IDL) 来指定 proto 文件,并将 PB 的设计范围限制为 Java、C++ 和 Python 中常见类型和属性的高效序列化。因此,PB 被设计为在(现有的)RPC 机制上分层。

相比之下,Facebook 在 2007 年末开源的 Thrift,在外观和感觉上都与 Protocol Buffers 非常相似——很可能是受到了 PB 的一些设计影响。但是,与 PB 不同的是,Thrift 使 RPC 成为一等公民:Thrift 编译器提供了多种传输选项(网络、文件、内存),并且还尝试针对更多语言。

两者哪个“更好”?两者都已经过大规模生产测试,所以这真的取决于你自己的情况。如果你主要对二进制序列化感兴趣,或者如果你已经拥有 RPC 机制,那么 Protocol Buffers 是一个很好的起点。相反,如果你还没有 RPC 机制并且正在寻找一种,那么 Thrift 可能是一个不错的选择。 (警告:从历史上看,Thrift 在所有语言的功能支持和性能方面并不一致,所以需要做一些研究)。

Protocol Buffers vs. Avro, MessagePack

虽然 Thrift 和 PB 的主要区别在于它们的范围,但 Avro 和 MessagePack 确实应该根据最近的趋势进行比较:动态语言的日益流行,以及 JSON 优于 XML。正如大多数 Web 开发人员都知道的那样,JSON 现在无处不在,并且易于解析、生成和阅读,这解释了它的流行。 JSON 也不需要模式,不提供类型检查,而且它是一种基于 UTF-8 的协议 - 换句话说,易于使用,但在上线时效率不高。

MessagePack 是有效的 JSON,但具有高效的二进制编码。与 JSON 一样,没有类型检查或模式,这取决于你的应用程序可能是专业的或劣势的。但是,如果你已经通过 API 流式传输 JSON 或将其用于存储,那么 MessagePack 可以作为替代品。

另一方面,Avro 是一种混合体。它的范围和功能接近 PB 和 Thrift,但它在设计时考虑了动态语言。与 PB 和 Thrift 不同,Avro 模式直接嵌入在消息的标头中,从而无需额外的编译阶段。此外,模式本身只是一个 JSON blob - 不需要自定义解析器!通过强制执行模式,Avro 允许我们进行数据投影(从每条记录中读取单个字段)、执行类型检查并强制执行整体消息结构。

“The Best” Serialization Format

考虑到 Google 和上述所有竞争对手对 Protocol Buffers 的使用,很明显没有一个明确的“最佳”选择。 相反,每个解决方案在其开发的上下文中都非常有意义,因此应该将相同的逻辑应用于你自己的情况。

如果你正在寻找经过实战考验的强类型序列化格式,那么 Protocol Buffers 是一个不错的选择。 如果你还需要各种内置的RPC机制,那么Thrift值得研究。 如果你已经在交换或使用 JSON,那么 MessagePack 几乎是一种直接优化。 最后,如果你喜欢强类型方面,但想要与动态语言轻松互操作的灵活性,那么此时 Avro 可能是你最好的选择。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值