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

JSS*_*all 5 protocol-buffers publish-subscribe zeromq

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

syntax = "proto3";

message Cake {
    int32 radius = 1;
}
Run Code Online (Sandbox Code Playgroud)

我可以找到很多 PUB/SUB 模式的示例,其中订阅者使用字符串过滤主题: socket.setsockopt_string(zmq.SUBSCRIBE, "abc")

但是,当涉及到 protobuf 二进制文件时,主题订阅是如何工作的呢?我是否使用字节本身,或者 ZMQ 是否为带有我可以在此类情况下使用的标头的消息提供包装器?

jam*_*vey 3

没有为此的包装器,主题只是 Zeromq 消息的第一帧。

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

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