您会推荐 Google Protocol Buffers 或 Caucho Hessian 用于跨语言的无线二进制格式吗?或者其他什么,例如 Facebook Thrift?
8 回答
我们使用 Caucho Hessian 是因为集成成本降低且简单。它的性能非常好,因此非常适合大多数情况。
对于一些跨语言集成不那么重要的应用程序,有一个更快的库可以压缩更多的性能,称为Kryo。不幸的是,它并没有被广泛使用,而且它的协议不像 Hessian 的协议那样准标准。
取决于用例。PB 更紧密耦合,最好在内部与紧密耦合的系统一起使用;不适合共享/公共接口(如在超过 2 个特定系统之间共享)。Hessian 更具自我描述性,在 Java 上有很好的性能。在我的测试中比 PB 好,但我确信这取决于用例。PB 似乎对文本数据有问题,也许它已经针对整数数据进行了优化。
我认为两者都不是特别适合公共接口,但考虑到您想要二进制格式,这可能不是一个大问题。
编辑:根据jvm-serializers基准,Hessian 的性能实际上并不那么好。只要您确保添加强制在 Java 上使用快速选项的标志,PB 就非常快。如果 PB 不适合公共接口,那又是什么呢?IMO,像 JSON 这样的开放格式在外部是优越的,而且通常速度不够快,性能并不重要。
对我来说,Caucho Hessian 是最好的。
上手非常容易,性能也不错。我在本地测试过,潜伏期约为 3 毫秒,在局域网上你可以预期约 10 毫秒。
使用 hessian,您不必编写另一个文件来定义模型(我们使用 java + java)。它节省了大量的开发和维护时间。
如果您需要支持从多种语言/平台互连应用程序,那么 Hessian 是最好的。如果您只使用 Java,则比 Kryo 更快。
我自己正在研究这个.. 到目前为止没有好的结论,但我发现http://dewpoint.snagdata.com/2008/10/21/google-protocol-buffers/总结了所有选项。
Muscle has a binary message transport. Sorry that I can't comment on the others as I haven't tried them.
我试过谷歌协议缓冲区。它适用于 C++/MFC、C#、PHP 和更多语言(请参阅:http ://code.google.com/p/protobuf/wiki/ThirdPartyAddOns ),并且无论传输和磁盘保存/加载如何,它都能很好地工作。
我会说 ProtocolBuffers、Thrift 或 Hessian 就其二进制格式而言非常相似——它们提供跨语言序列化支持。固有的序列化可能在它们之间有一些小的性能差异(大小/空间权衡),但这不是最重要的事情。ProtocolBuffers 无疑是一种性能良好的 IDL 定义格式,它具有使其具有吸引力的可扩展性特性。
但是,在问题中使用“在线”意味着使用通信库。这里谷歌提供了protobuf RPC的接口定义,相当于制定了一个规范,所有的实现细节都留给实现者。这是不幸的,因为这意味着事实上没有跨语言实现 - 除非您可以找到此处可能提到的跨语言实现http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns。我见过一些支持 java 和 c,或 c 和 c++,或 python 和 c 等的 RPC 实现,但在这里你只需要找到一个满足你具体要求的库并进行评估,否则你可能会感到失望。(至少我对编写 protobuf-rpc-pro 感到失望)
Kyro 是一种类似 protobuf 的序列化格式,但仅限于 java。Kyro/Net 是一个使用 Kryo 消息的纯 Java RPC 实现。因此,对于“跨语言”通信来说,这不是一个好的选择。
今天,ICE http://www.zeroc.com/和提供开箱即用的 RPC 实现的 Thrift似乎是目前最好的跨语言 RPC 实现。