Protocol buffers 如何使用protobuf二进制文件在PUB/SUB中进行过滤?

Protocol buffers 如何使用protobuf二进制文件在PUB/SUB中进行过滤?,protocol-buffers,zeromq,publish-subscribe,Protocol Buffers,Zeromq,Publish Subscribe,假设我想用ZMQ使用cake.proto中定义的协议序列化和传输protobuf二进制文件: syntax = "proto3"; message Cake { int32 radius = 1; } 我可以找到许多PUB/SUB模式的示例,其中订阅者使用字符串过滤主题: socket.setsockopt_字符串(zmq.SUBSCRIBE,“abc”) 但对于protobuf二进制文件,订阅主题是如何工作的呢?我是使用字节本身,还是ZMQ为消息提供了一个可以用于此类情况的头的包装

假设我想用ZMQ使用
cake.proto
中定义的协议序列化和传输protobuf二进制文件:

syntax = "proto3";

message Cake {
    int32 radius = 1;
}
我可以找到许多PUB/SUB模式的示例,其中订阅者使用字符串过滤主题:
socket.setsockopt_字符串(zmq.SUBSCRIBE,“abc”)


但对于protobuf二进制文件,订阅主题是如何工作的呢?我是使用字节本身,还是ZMQ为消息提供了一个可以用于此类情况的头的包装器?

没有包装器,主题只是zeromq消息的第一帧

如果您确信protobuf消息总是以特定的字节序列(构成主题)开始,那么您可以订阅该字节前缀模式


另一个选项是将主题模式复制到初始帧中,然后通过
ZMQ\u SNDMORE
添加protobuf帧。如果可以将多个protobuf帧打包到同一个zmq消息中,那么效率很高。如果每个protobuf消息都有自己的“subject”,那么每个protobuf都会有额外的subject帧的开销。

是的,我只是没有意识到(在我看来,任何地方都没有很好的文档记录)当负载是原始二进制时,为了使用PUB/SUB,就必须使用multipart(或者事情变得非常糟糕).第一种方法有点描述,但我的建议是不要使用它,因为没有定义字段序列化的(AFAIK)顺序。后一种方法非常有效。