如何使用 protobuf 二进制文件过滤 PUB/SUB?
How to filter in PUB/SUB with protobuf binaries?
假设我想使用 cake.proto
中定义的协议使用 ZMQ 序列化和传输 protobuf 二进制文件:
syntax = "proto3";
message Cake {
int32 radius = 1;
}
我可以找到很多 PUB/SUB 模式的示例,其中订阅者使用字符串过滤主题:
socket.setsockopt_string(zmq.SUBSCRIBE, "abc")
但是当涉及到 protobuf 二进制文件时,订阅主题是如何工作的?我是自己使用字节还是 ZMQ 是否为带有 header 的消息提供包装器,我可以在这种情况下使用?
这里没有包装器,主题只是 zeromq 消息的第一帧。
如果您确信您的 protobuf 消息将始终以特定的字节序列(构成您的主题)开头,那么是的,您可以只订阅该字节前缀模式。
另一种选择是将主题模式复制到初始帧中,然后通过 ZMQ_SNDMORE
添加 protobuf 帧。如果您可以将许多 protobuf 帧打包到同一条 zmq 消息中,那么效率会很好。如果每个 protobuf 消息都有自己的 "subject" 那么每个 protobuf 都会有一个额外的主题框架的开销。
假设我想使用 cake.proto
中定义的协议使用 ZMQ 序列化和传输 protobuf 二进制文件:
syntax = "proto3";
message Cake {
int32 radius = 1;
}
我可以找到很多 PUB/SUB 模式的示例,其中订阅者使用字符串过滤主题:
socket.setsockopt_string(zmq.SUBSCRIBE, "abc")
但是当涉及到 protobuf 二进制文件时,订阅主题是如何工作的?我是自己使用字节还是 ZMQ 是否为带有 header 的消息提供包装器,我可以在这种情况下使用?
这里没有包装器,主题只是 zeromq 消息的第一帧。
如果您确信您的 protobuf 消息将始终以特定的字节序列(构成您的主题)开头,那么是的,您可以只订阅该字节前缀模式。
另一种选择是将主题模式复制到初始帧中,然后通过 ZMQ_SNDMORE
添加 protobuf 帧。如果您可以将许多 protobuf 帧打包到同一条 zmq 消息中,那么效率会很好。如果每个 protobuf 消息都有自己的 "subject" 那么每个 protobuf 都会有一个额外的主题框架的开销。