如何使用ZeroMQ PUB / SUB设置发送字节消息?

时间:2017-01-08 04:19:26

标签: zeromq

所以我是ZeroMQ的新手,我正在尝试使用PUB / SUB设置向ZeroMQ发送字节消息。

编程语言的选择对于这个问题并不重要,因为我使用zmq进行多种语言之间的通信。

这是我在python中的服务器代码:

import zmq
import time

port = "5556"
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:%s" % port)
while True:
    socket.send(b'\x84\xa5Title\xa2hi\xa1y\xcb\x00\x00\x00\x00\x00\x00\x00\x00\xa1x\xcb@\x1c\x00\x00\x00\x00\x00\x00\xa4Data\x08')
    time.sleep(1)

这是我在python中的客户端代码:

import zmq

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:5556")

total_value = 0
for update_nbr in range (5):
    string = socket.recv()
    print (string)

我的客户只需阻止 string = socket.recv()

我做了一些研究,显然,如果我要使用PUB / SUB设置发送字符串,我需要设置一些" 主题过滤器"为了使它工作。但是如果我发送一些字节消息,我不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

  

ZeroMQ定义协议,保证行为和消息内容的跨平台兼容性

根本原因:
开始接收消息
必须更改初始"主题过滤器" SUB插座的状态
(最初为"什么都不接收" -subscription)

ZeroMQ是一套可爱的工具,围绕智能原则创建。

其中一个说,在 SUB 旁边做什么,直到 .setsockopt( zmq.SUBSCRIBE, ... ) 明确说明,要订阅什么,开始检查收到的消息(较旧的zmq粉丝记得最初的设计,其中 PUB -side始终将所有消息分发到每个连接的 SUB - "无线电广播接收器",在每个消息接收到 SUB 的情况下执行"主题过滤"在其上"更新版本的zmq反转架构并执行 PUB - 侧过滤。)

无论如何,"主题过滤器的初始状态"说得通。谁知道什么应该先验收到?没有人。所以一无所获。

鉴于您需要或希望开始工作,轻松订阅任何内容......让任何消息都能通过。

是的,那么简单.setsockopt( zmq.SUBSCRIBE, "" )

如果需要一些基于密钥的处理并且消息具有合理的大小(没有千兆BLOB),则可以在消息字符串前面简单地添加一些密钥(或者如果更多hacky则为字节字段)(或有效负载字节字段。)

当然,如果在 PUB 旁边执行zmq过滤,可以节省传输层开销的一部分(对于较旧的API版本无效) ,否则订阅接收"任何东西通常都没什么大不了的。并在处理剩余的消息有效负载之前检查消息是否有一些预先组装的上下文密钥(前缀子字符串,字节字段等)。

最佳下一步:

如果您的代码努力进入生产状态,而不仅仅是学术界的例子,那么还需要做更多的工作,为恶劣的现实生产环境提供生存能力措施。

使用ZeroMQ实现这一目标的绝佳视角以及对真实设计的良好阅读是Pieter HINTJEN的书" Code Connected,Vol.1" may check my posts on ZeroMQ to find the book's direct pdf-link)。

另一个好读物来自ZeroMQ的共同之父Martin SUSTRIK,low-level truths about the ZeroMQ implementation details & scale-ability