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

Lou*_* Ng 6 distributed-computing zeromq low-latency pyzmq

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

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

这是我的服务器代码:

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)
Run Code Online (Sandbox Code Playgroud)

这是我的 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)
Run Code Online (Sandbox Code Playgroud)

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

我已经做了一些研究,所以显然,如果我要使用PUB / SUB设置发送字符串,我需要设置一些“主题过滤器”才能使其工作。但如果我要发送一些字节消息,我不确定该怎么做。

use*_*197 3

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

根本原因:
要开始接收消息,
必须更改 SUB 套接字的初始“主题过滤器”状态
(最初是“不接收任何内容”订阅)

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

其中之一是,在SUB-side 上不执行任何操作,直到.setsockopt( zmq.SUBSCRIBE, ... )明确说明要订阅什么,然后开始检查传入的消息(老 zmq 粉丝记得最初的设计,其中PUB-side 总是将所有消息分发到每个连接的路径上)SUB-“无线电广播接收器”,在接收到每条消息时,端SUB会自行执行“主题过滤”。较新版本的 zmq 会反转架构并执行PUB端过滤。

无论如何,“主题过滤器”的初始状态是有意义的。谁知道先验应该接收什么?没有人。所以什么也收不到。

如果您需要或希望开始工作,可以轻松订阅任何内容……让任何消息都能通过。

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

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

当然,如果 zmq 过滤在一侧执行(对旧的 API 版本无效),则可以节省一部分传输层开销PUB,否则订阅接收“任何内容”通常没什么大不了的并在处理消息有效负载的其余部分之前检查消息中是否有一些预组装的上下文键(前缀子字符串、字节字段等)。


最好的下一步:

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

Pieter HINTJEN 的书“Code Connected, Vol.1”可以查看我在ZeroMQ上的帖子以找到该书的直接pdf链接)是实现此目的的绝对绝佳视角,也是使用 ZeroMQ 进行实际设计的好读物。

另外,ZeroMQ 联合创始人 Martin SUSTRIK 的另一本好书讲述了有关 ZeroMQ 实现细节和可扩展性的底层事实