ZeroMQ +协议缓冲区

时间:2011-09-12 15:50:07

标签: protocols network-protocols zeromq

ZeroMQ FAQ页面建议使用Google的protobuf作为序列化邮件内容的方式。

有没有人看到一个很好的用法示例?

我还需要得到“序列化消息的最大优势是什么?”的答案。 - 是否可能是我可以生活的东西,并利用更细长的管道。

我非常喜欢.proto文件和protoc编译器的想法。

此外,似乎另一个在操场上投掷的好工具是libev,任何 欢迎评论:)

4 个答案:

答案 0 :(得分:22)

如果您100%确定将通过ZMQ进行通信的程序将始终能够理解彼此的二进制格式(例如,因为它们总是分布在一起并且无论如何都使用相同的编译器选项进行编译)我认为通过序列化添加的开销没有任何好处。

一旦上述条件无法满足(例如在不同主机类型上运行的伙伴程序,以不同语言编写的程序,甚至可以及时独立发展的伙伴程序 - 这可能导致其原始二进制结构不兼容)序列化变为很可能是必须的。

现在似乎每个人和他们的兄弟都在创建序列化解决方案,这可能表明没有一种尺寸适合所有解决方案。 This page包含对27(!!)个不同序列化系统的序列化时间,反序列化时间和大小的非常全面的基准测试。不要跳过该页面的第一段,它说“警告,基准可能会误导”。您的应用程序,您的数据对您来说很重要,但是那里提供的数据可能会帮助您缩小您想要详细研究的选择范围。

答案 1 :(得分:15)

这是一个通过java和C ++发送和接收消息的示例:

在java中序列化:

Person person = Person.newBuilder().setName("chand")
    .setEmail("chand@test.com").setId(55555).build();
socket.send(person.toByteArray(), 0);

在java中反序列化:

byte[] reply = socket.recv(0);
Person person2 = Person.parseFrom(reply);

使用C ++进行序列化:

Person p = Person();
std::string str;
p.SerializeToString(&str);
int sz = str.length();
zmq::message_t *query = new message_t(sz);
memcpy(query->data (), str.c_str(), sz);
socket->send (*query);

在C ++中反序列化

zmq::message_t resultset(100);
socket->recv (&resultset);

Person p = Person();
p.ParseFromArray(resultset.data(), resultset.size());
printf("\n Server : %s", p.name().c_str());

答案 2 :(得分:4)

我不确定0mq中的PUB / SUB是否可以使用protobuf,因为0mq需要在msg的头部有一个字符串主题..但是protobuf首先放置一个字段描述符。

实际上这里是一个解决方案的链接。

http://www.dotkam.com/2011/09/09/zeromq-and-google-protocol-buffers/

欢呼声

答案 3 :(得分:1)

通信时始终需要序列化。结构是随机访问。像ZeroMQ这样的通信层是串行的。

您可以使用"默认序列化"随你的语言而来。

例如在C ++中,没有指针的结构将具有某种二进制布局,可以直接转换为字节数组。这种二进制布局是间接的序列化层,并且是语言和编译器特有的。

只要您将自己局限于没有指针且在管道两端使用相同编译器和语言的结构...随意避免在提供的默认布局之上执行其他序列化的库。